更新心理健康模块配置和前端依赖

This commit is contained in:
李旭明 committed 2025-08-04 11:04:00 +08:00
1 parent 593aa01a70
commit 7ad62a88c4
120 files changed
+19796 -82

No files matched your search

@@ -0,0 +1,480 @@
# 社团管理系统开发计划
## 1. 项目总览
### 1.1 项目目标
开发完整的校园社团管理系统,支持社团管理、活动组织、考勤签到、材料收集等功能,提升校园社团活动的组织效率和管理水平。
### 1.2 开发团队
- **项目经理**: 负责整体进度把控和资源协调
- **后端开发**: 负责Spring Boot API开发
- **前端开发**: 负责Vue 3管理界面开发
- **移动端开发**: 负责uni-app移动端开发
- **测试工程师**: 负责功能测试和集成测试
### 1.3 技术栈
- **后端**: Spring Boot 3.4.6 + MyBatis-Plus + MySQL
- **前端**: Vue 3 + TypeScript + Element Plus
- **移动端**: Vue 3.4.21 + uni-app + uview-plus 3.4.45
- **工具**: Git + Maven + npm + Docker
## 2. 开发阶段规划
### 2.1 第一阶段:基础架构搭建(预计3天)
#### 2.1.1 后端基础架构(1.5天)
**负责人**: 后端开发
**任务清单**:
- [x] 创建Spring Boot项目结构
- [x] 配置MyBatis-Plus和数据源
- [x] 集成Sa-Token权限框架
- [x] 配置Swagger API文档
- [x] 创建基础实体类和工具类
- [x] 配置日志和异常处理
**交付物**:
- 可运行的Spring Boot项目
- 基础配置文件
- 通用工具类和异常处理
#### 2.1.2 前端基础架构(1天)
**负责人**: 前端开发
**任务清单**:
- [x] 创建Vue 3 + TypeScript项目
- [x] 集成Element Plus UI框架
- [x] 配置路由和状态管理
- [x] 集成Axios和请求拦截器
- [x] 创建基础布局和通用组件
- [x] 配置ESLint和代码规范
**交付物**:
- 可运行的前端项目
- 基础页面布局
- 通用组件库
#### 2.1.3 数据库设计和初始化(0.5天)
**负责人**: 后端开发
**任务清单**:
- [x] 设计数据库表结构
- [x] 创建建表SQL脚本
- [x] 初始化基础数据
- [x] 配置数据库索引
- [x] 创建数据库文档
**交付物**:
- 完整的数据库设计文档
- 建表SQL脚本
- 基础数据初始化脚本
### 2.2 第二阶段:社团管理模块(预计5天)
#### 2.2.1 社团信息管理(2天)
**负责人**: 后端开发 + 前端开发
**后端任务**(1天):
- [ ] 创建社团相关实体类(Club、Member等)
- [ ] 实现社团CRUD操作(ClubController、ClubService、ClubMapper)
- [ ] 实现社团成员管理功能
- [ ] 编写单元测试
- [ ] 生成API文档
**前端任务**(1天):
- [ ] 创建社团管理页面(列表、新增、编辑)
- [ ] 实现社团信息表单组件
- [ ] 实现社团成员管理界面
- [ ] 集成文件上传功能(logo、章程)
- [ ] 完成页面联调测试
**交付物**:
- 社团CRUD功能
- 社团成员管理功能
- 完整的前后端联调
#### 2.2.2 志愿者队伍管理(1.5天)
**负责人**: 后端开发 + 前端开发
**后端任务**(0.75天):
- [ ] 创建志愿者队伍实体类
- [ ] 实现志愿者队伍CRUD操作
- [ ] 实现队伍成员管理功能
- [ ] 编写API文档
**前端任务**(0.75天):
- [ ] 创建志愿者队伍管理页面
- [ ] 实现队伍信息管理界面
- [ ] 实现队伍成员管理功能
- [ ] 完成功能测试
**交付物**:
- 志愿者队伍管理功能
- 队伍成员管理功能
#### 2.2.3 权限和数据权限(1.5天)
**负责人**: 后端开发
**任务清单**:
- [ ] 配置菜单权限
- [ ] 实现数据权限过滤
- [ ] 集成角色权限管理
- [ ] 实现指导老师权限分配
- [ ] 编写权限测试用例
**交付物**:
- 完整的权限控制体系
- 数据权限过滤功能
- 权限测试报告
### 2.3 第三阶段:活动管理模块(预计6天)
#### 2.3.1 活动基础管理(2.5天)
**负责人**: 后端开发 + 前端开发
**后端任务**(1.25天):
- [ ] 创建活动相关实体类(Activity等)
- [ ] 实现活动CRUD操作
- [ ] 实现活动复制功能
- [ ] 实现活动状态管理
- [ ] 集成指导老师管理
- [ ] 编写API文档
**前端任务**(1.25天):
- [ ] 创建活动管理页面
- [ ] 实现活动信息表单(支持JSON数据)
- [ ] 实现活动卡片组件
- [ ] 实现活动筛选和搜索
- [ ] 集成文件上传(海报)
- [ ] 完成联调测试
**交付物**:
- 活动CRUD功能
- 活动复制功能
- 活动状态管理
#### 2.3.2 报名管理功能(2天)
**负责人**: 后端开发 + 前端开发
**后端任务**(1天):
- [ ] 创建报名相关实体类
- [ ] 实现个人报名功能
- [ ] 实现团队报名功能
- [ ] 实现报名审核功能
- [ ] 实现报名统计功能
**前端任务**(1天):
- [ ] 创建报名管理页面
- [ ] 实现报名信息展示
- [ ] 实现审核操作界面
- [ ] 实现团队信息查看
- [ ] 完成功能测试
**交付物**:
- 个人/团队报名功能
- 报名审核功能
- 报名统计功能
#### 2.3.3 活动评分系统(1.5天)
**负责人**: 后端开发 + 前端开发
**后端任务**(0.75天):
- [ ] 创建评分实体类
- [ ] 实现评分功能
- [ ] 实现评分统计
- [ ] 编写API文档
**前端任务**(0.75天):
- [ ] 实现五星评分组件
- [ ] 创建评分管理页面
- [ ] 实现评分统计展示
- [ ] 完成功能测试
**交付物**:
- 五星评分功能
- 评分统计功能
### 2.4 第四阶段:考勤签到模块(预计4天)
#### 2.4.1 考勤任务管理(1.5天)
**负责人**: 后端开发 + 前端开发
**后端任务**(0.75天):
- [ ] 创建考勤任务实体类
- [ ] 实现考勤任务CRUD
- [ ] 实现任务状态管理
- [ ] 编写API文档
**前端任务**(0.75天):
- [ ] 创建考勤任务管理页面
- [ ] 实现任务创建和配置
- [ ] 实现任务状态控制
- [ ] 完成功能测试
**交付物**:
- 考勤任务管理功能
- 任务状态控制功能
#### 2.4.2 签到功能实现(2.5天)
**负责人**: 后端开发 + 前端开发 + 移动端开发
**后端任务**(0.8天):
- [ ] 创建签到记录实体类
- [ ] 实现签到接口
- [ ] 实现地理位置验证
- [ ] 实现签到统计功能
**前端任务**(0.8天):
- [ ] 实现Web端签到页面
- [ ] 实现签到记录展示
- [ ] 实现签到统计功能
**移动端任务**(0.9天):
- [ ] 实现地理位置获取
- [ ] 实现地图签到组件
- [ ] 实现签到页面
- [ ] 完成移动端测试
**交付物**:
- Web端签到功能
- 移动端地理位置签到
- 签到统计功能
### 2.5 第五阶段:材料收集模块(预计3天)
#### 2.5.1 材料收集任务(1.5天)
**负责人**: 后端开发 + 前端开发
**后端任务**(0.75天):
- [ ] 创建材料收集实体类
- [ ] 实现收集任务管理
- [ ] 实现多轮收集功能
- [ ] 编写API文档
**前端任务**(0.75天):
- [ ] 创建材料收集管理页面
- [ ] 实现任务配置功能
- [ ] 实现收集状态管理
- [ ] 完成功能测试
**交付物**:
- 材料收集任务管理
- 多轮收集功能
#### 2.5.2 材料提交和管理(1.5天)
**负责人**: 后端开发 + 前端开发
**后端任务**(0.75天):
- [ ] 实现材料提交功能
- [ ] 支持文本、附件、图片格式
- [ ] 实现材料查看功能
- [ ] 编写API文档
**前端任务**(0.75天):
- [ ] 实现材料提交页面
- [ ] 支持多种格式上传
- [ ] 实现材料查看界面
- [ ] 完成功能测试
**交付物**:
- 材料提交功能
- 多格式支持
- 材料查看功能
### 2.6 第六阶段:系统集成和完善(预计4天)
#### 2.6.1 学生信息系统集成(1.5天)
**负责人**: 后端开发
**任务清单**:
- [ ] 集成学生信息表查询
- [ ] 集成班级信息表查询
- [ ] 实现数据同步功能
- [ ] 编写集成测试用例
- [ ] 完成集成测试
**交付物**:
- 学生信息系统集成
- 数据同步功能
- 集成测试报告
#### 2.6.2 通知系统集成(1天)
**负责人**: 后端开发
**任务清单**:
- [ ] 实现活动通知功能
- [ ] 实现报名结果通知
- [ ] 实现考勤提醒功能
- [ ] 实现材料收集通知
- [ ] 完成通知测试
**交付物**:
- 完整的通知系统
- 各类通知功能
#### 2.6.3 导入导出功能(1.5天)
**负责人**: 后端开发 + 前端开发
**后端任务**(0.75天):
- [ ] 实现Excel导出功能
- [ ] 实现Excel导入功能
- [ ] 实现数据校验
- [ ] 编写导入导出API
**前端任务**(0.75天):
- [ ] 集成导出功能按钮
- [ ] 实现导入功能界面
- [ ] 完成导入导出测试
**交付物**:
- Excel导入导出功能
- 数据校验功能
### 2.7 第七阶段:测试和优化(预计3天)
#### 2.7.1 功能测试(1.5天)
**负责人**: 测试工程师 + 开发团队
**任务清单**:
- [ ] 编写测试用例
- [ ] 执行功能测试
- [ ] 执行集成测试
- [ ] 记录和修复Bug
- [ ] 完成回归测试
**交付物**:
- 完整的测试报告
- Bug修复记录
- 测试用例文档
#### 2.7.2 性能优化(1天)
**负责人**: 后端开发 + 前端开发
**任务清单**:
- [ ] 数据库查询优化
- [ ] 接口性能优化
- [ ] 前端加载优化
- [ ] 缓存策略优化
- [ ] 性能测试
**交付物**:
- 性能优化报告
- 性能测试结果
#### 2.7.3 文档完善(0.5天)
**负责人**: 开发团队
**任务清单**:
- [ ] 完善API文档
- [ ] 更新数据库文档
- [ ] 编写用户手册
- [ ] 更新变更记录
**交付物**:
- 完整的项目文档
- 用户使用手册
- 变更记录文档
## 3. 里程碑计划
### 3.1 里程碑时间表
| 里程碑 | 完成时间 | 主要交付物 |
|--------|----------|-----------|
| 基础架构完成 | 第3天 | 可运行的基础框架 |
| 社团管理模块完成 | 第8天 | 社团和志愿者管理功能 |
| 活动管理模块完成 | 第14天 | 活动全生命周期管理 |
| 考勤签到模块完成 | 第18天 | Web端和移动端签到功能 |
| 材料收集模块完成 | 第21天 | 材料收集和管理功能 |
| 系统集成完成 | 第25天 | 完整的系统功能 |
| 项目交付 | 第28天 | 完整的社团管理系统 |
### 3.2 关键节点
- **第3天**: 基础架构评审
- **第8天**: 社团管理功能演示
- **第14天**: 活动管理功能演示
- **第21天**: 核心功能演示
- **第25天**: 系统集成测试
- **第28天**: 项目验收
## 4. 风险管理
### 4.1 技术风险
| 风险项 | 风险等级 | 应对措施 |
|--------|----------|----------|
| 地理位置API兼容性 | 中 | 提前进行移动端适配测试 |
| 大文件上传性能 | 中 | 实现分片上传和压缩 |
| 数据库性能 | 低 | 合理设计索引和分页 |
| 第三方集成复杂度 | 中 | 预留充足的集成测试时间 |
### 4.2 进度风险
| 风险项 | 风险等级 | 应对措施 |
|--------|----------|----------|
| 需求变更 | 中 | 严格控制需求变更流程 |
| 技术难点攻克时间 | 中 | 提前进行技术预研 |
| 人员配合度 | 低 | 建立良好的沟通机制 |
| 测试时间不足 | 中 | 开发过程中进行单元测试 |
### 4.3 质量风险
| 风险项 | 风险等级 | 应对措施 |
|--------|----------|----------|
| 用户体验不佳 | 中 | 定期进行用户体验评审 |
| 性能不达标 | 低 | 持续进行性能监控 |
| 安全漏洞 | 中 | 进行安全测试和代码审查 |
| 数据准确性 | 中 | 加强数据校验和测试 |
## 5. 资源需求
### 5.1 人力资源
- **后端开发工程师**: 1人,全程参与
- **前端开发工程师**: 1人,全程参与
- **移动端开发工程师**: 0.5人,第四阶段重点参与
- **测试工程师**: 0.5人,第七阶段重点参与
- **项目经理**: 0.2人,全程管理协调
### 5.2 技术资源
- **开发环境**: JDK 17、Node.js 18、MySQL 8.0、Redis
- **开发工具**: IntelliJ IDEA、VS Code、Git、Maven、npm
- **测试环境**: 独立的测试服务器和数据库
- **部署环境**: Docker容器化部署
### 5.3 时间资源
- **总开发周期**: 28个工作日(约5.6周)
- **核心开发时间**: 21个工作日
- **测试优化时间**: 7个工作日
- **缓冲时间**: 建议预留20%的缓冲时间
## 6. 质量保证
### 6.1 代码质量
- **代码规范**: 严格遵循项目编码规范
- **代码审查**: 关键功能必须进行代码审查
- **单元测试**: 核心业务逻辑覆盖率≥80%
- **文档同步**: 代码变更必须同步更新文档
### 6.2 功能质量
- **需求追溯**: 每个功能都有对应的需求来源
- **测试覆盖**: 所有功能都有对应的测试用例
- **用户验收**: 关键功能需要用户参与验收
- **性能达标**: 接口响应时间≤2秒
### 6.3 交付质量
- **文档完整**: 提供完整的API文档和用户手册
- **部署简便**: 提供一键部署脚本
- **培训支持**: 提供用户培训和技术支持
- **维护计划**: 提供后续维护和升级计划
## 7. 沟通计划
### 7.1 日常沟通
- **日会**: 每日晨会,15分钟,同步进展和问题
- **周会**: 每周例会,60分钟,回顾进展和计划
- **文档同步**: 实时更新项目文档和变更记录
### 7.2 里程碑评审
- **功能演示**: 每个模块完成后进行功能演示
- **代码评审**: 关键功能完成后进行代码评审
- **用户反馈**: 定期收集用户反馈并优化
### 7.3 问题升级
- **技术问题**: 超过4小时无法解决的技术问题及时升级
- **需求问题**: 需求不清楚或有争议的及时澄清
- **进度问题**: 可能影响里程碑的进度问题及时上报
这个开发计划为社团管理系统的实施提供了详细的路线图,请根据实际团队情况和资源约束进行适当调整。建议在项目启动前进行一次详细的计划评审,确保所有参与人员对计划有清晰的理解。
@@ -0,0 +1,878 @@
# 社团管理系统技术架构设计
## 1. 技术架构总览
### 1.1 整体架构
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端Web应用 │ │ 移动端应用 │ │ 管理后台 │
│ Vue 3 + TS │ │ uni-app │ │ Element Plus │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ API网关 + 认证中心 │
│ Spring Security + Sa-Token │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 社团管理微服务 │
│ Spring Boot 3.4.6 │
│ MyBatis-Plus │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ 数据持久层 │
│ MySQL 8.0 + Redis │
│ 文件存储 + 消息队列 │
└─────────────────────────────────────────────────────────────────┘
```
### 1.2 模块化设计
- **stgl-club-management**: 社团管理核心模块
- **stgl-activity-management**: 活动管理模块
- **stgl-attendance-management**: 考勤签到模块
- **stgl-material-management**: 材料收集模块
- **stgl-integration**: 系统集成模块
## 2. 数据库设计方案
### 2.1 数据库架构
- **主数据库**: MySQL 8.0,存储业务数据
- **缓存数据库**: Redis,存储会话、缓存数据
- **分库分表策略**: 按租户分库,大表按时间分表
### 2.2 核心表结构设计
#### 社团信息表(stgl_club)
```sql
CREATE TABLE `stgl_club` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
`club_name` varchar(100) NOT NULL COMMENT '社团名称',
`club_type` varchar(50) NOT NULL COMMENT '社团类型',
`establish_date` date COMMENT '成立日期',
`description` text COMMENT '社团简介',
`email` varchar(100) COMMENT '邮箱',
`phone` varchar(20) COMMENT '电话',
`logo_url` varchar(500) COMMENT 'logo图片路径',
`president_name` varchar(50) COMMENT '社长姓名',
`president_student_no` varchar(20) COMMENT '社长学号',
`president_dept` varchar(100) COMMENT '社长院系',
`president_major` varchar(100) COMMENT '社长专业',
`president_class` varchar(100) COMMENT '社长班级',
`president_phone` varchar(20) COMMENT '社长联系方式',
`vice_president_name` varchar(50) COMMENT '副社长姓名',
`vice_president_student_no` varchar(20) COMMENT '副社长学号',
`advisor_name` varchar(50) COMMENT '指导老师姓名',
`advisor_dept` varchar(100) COMMENT '指导老师所属院系',
`member_limit` int DEFAULT 0 COMMENT '成员规模上限',
`departments` text COMMENT '组织架构',
`recruit_cycle` varchar(50) COMMENT '招新周期',
`recruit_time` varchar(50) COMMENT '招新时间',
`activity_frequency` varchar(50) COMMENT '活动频率',
`funding_sources` varchar(200) COMMENT '经费来源',
`charter_url` varchar(500) COMMENT '章程文档路径',
`honors` text COMMENT '历史荣誉',
`status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-停用)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_club_name` (`club_name`, `tenant_id`),
KEY `idx_club_type` (`club_type`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='社团信息表';
```
#### 活动信息表(stgl_activity)
```sql
CREATE TABLE `stgl_activity` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
`activity_name` varchar(100) NOT NULL COMMENT '活动名称',
`activity_type` varchar(50) NOT NULL COMMENT '活动类型',
`activity_theme` varchar(100) COMMENT '活动主题',
`start_time` datetime COMMENT '开始时间',
`end_time` datetime COMMENT '结束时间',
`location` varchar(200) COMMENT '活动地点',
`description` text COMMENT '活动简介',
`poster_url` varchar(500) COMMENT '活动海报路径',
`related_club_id` bigint(20) COMMENT '关联社团ID',
`organizer_name` varchar(100) COMMENT '主办方名称',
`organizer_type` varchar(50) COMMENT '主办方类型',
`organizer_contact` varchar(100) COMMENT '主办方联系人',
`organizer_phone` varchar(20) COMMENT '主办方电话',
`co_organizers` json COMMENT '承办方信息',
`instructors` json COMMENT '指导老师列表',
`registration_type` tinyint COMMENT '报名方式(1-个人 2-团队 3-均可)',
`registration_start` datetime COMMENT '报名开始时间',
`registration_end` datetime COMMENT '报名结束时间',
`registration_status` tinyint COMMENT '报名状态',
`max_participants` int COMMENT '总人数上限',
`max_teams` int COMMENT '团队数量上限',
`team_size_min` int COMMENT '每队最小人数',
`team_size_max` int COMMENT '每队最大人数',
`need_approval` tinyint DEFAULT 0 COMMENT '是否需要审核',
`activity_status` varchar(20) COMMENT '活动状态',
`is_finished` tinyint DEFAULT 0 COMMENT '是否为已办活动',
`summary` text COMMENT '活动总结报告',
`achievements` text COMMENT '活动成果',
`import_source` varchar(200) COMMENT '导入来源信息',
PRIMARY KEY (`id`),
KEY `idx_activity_name` (`activity_name`),
KEY `idx_activity_type` (`activity_type`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`),
KEY `idx_status` (`activity_status`),
KEY `idx_club_id` (`related_club_id`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动信息表';
```
### 2.3 索引优化策略
- **主键索引**: 所有表使用雪花ID作为主键
- **唯一索引**: 社团名称、活动名称等业务唯一字段
- **复合索引**: tenant_id + deleted(软删除 + 多租户)
- **时间索引**: 创建时间、活动时间等时间字段
- **状态索引**: 活动状态、报名状态等枚举字段
## 3. 后端服务架构
### 3.1 分层架构设计
```
Controller层 (REST API)
├── ClubController # 社团管理接口
├── ActivityController # 活动管理接口
├── AttendanceController # 考勤管理接口
└── MaterialController # 材料收集接口
Service层 (业务逻辑)
├── ClubService # 社团业务服务
├── ActivityService # 活动业务服务
├── AttendanceService # 考勤业务服务
└── MaterialService # 材料收集服务
Mapper层 (数据访问)
├── ClubMapper # 社团数据访问
├── ActivityMapper # 活动数据访问
├── AttendanceMapper # 考勤数据访问
└── MaterialMapper # 材料数据访问
Domain层 (实体模型)
├── entity/ # 数据库实体
├── vo/ # 视图对象
└── dto/ # 数据传输对象
```
### 3.2 核心服务设计
#### 社团管理服务 (ClubService)
```java
@Service
public interface ClubService {
// 基础CRUD
R<ClubVo> getClubById(Long id);
R<List<ClubVo>> getClubList(ClubQueryDto queryDto);
R<Void> createClub(ClubCreateDto createDto);
R<Void> updateClub(ClubUpdateDto updateDto);
R<Void> deleteClub(Long id);
// 成员管理
R<List<MemberVo>> getClubMembers(Long clubId);
R<Void> addMember(MemberAddDto addDto);
R<Void> removeMember(Long clubId, Long userId);
R<Void> importMembers(Long clubId, MultipartFile file);
// 权限管理
R<Void> assignRole(Long clubId, Long userId, Integer roleType);
R<List<PermissionVo>> getClubPermissions(Long clubId);
}
```
#### 活动管理服务 (ActivityService)
```java
@Service
public interface ActivityService {
// 活动CRUD
R<ActivityVo> getActivityById(Long id);
R<TableDataInfo> getActivityList(ActivityQueryDto queryDto);
R<Void> createActivity(ActivityCreateDto createDto);
R<Void> updateActivity(ActivityUpdateDto updateDto);
R<Void> deleteActivity(Long id);
R<Void> copyActivity(Long sourceId, ActivityCreateDto createDto);
// 报名管理
R<List<RegistrationVo>> getRegistrations(Long activityId);
R<Void> approveRegistration(Long registrationId, String remark);
R<Void> rejectRegistration(Long registrationId, String remark);
// 评分管理
R<List<RatingVo>> getActivityRatings(Long activityId);
R<ActivityStatVo> getActivityStats(Long activityId);
}
```
### 3.3 API接口设计规范
#### 统一响应格式
```java
// 分页查询响应
@Data
public class TableDataInfo {
private long total;
private List<Object> rows;
private int code;
private String msg;
}
// 普通响应
@Data
public class R<T> {
private int code;
private String msg;
private T data;
public static <T> R<T> ok() { ... }
public static <T> R<T> ok(T data) { ... }
public static <T> R<T> fail(String msg) { ... }
}
```
#### 接口URL规范
```
GET /api/stgl/club/list # 社团列表
GET /api/stgl/club/{id} # 社团详情
POST /api/stgl/club # 创建社团
PUT /api/stgl/club/{id} # 更新社团
DELETE /api/stgl/club/{id} # 删除社团
GET /api/stgl/activity/list # 活动列表
POST /api/stgl/activity # 创建活动
PUT /api/stgl/activity/{id} # 更新活动
POST /api/stgl/activity/{id}/copy # 复制活动
GET /api/stgl/attendance/list # 考勤列表
POST /api/stgl/attendance/task # 创建考勤任务
POST /api/stgl/attendance/checkin # 签到接口
GET /api/stgl/material/list # 材料列表
POST /api/stgl/material/task # 创建收集任务
POST /api/stgl/material/submit # 提交材料
```
## 4. 前端架构设计
### 4.1 Vue 3 + TypeScript 架构
```
src/
├── api/ # API接口定义
│ ├── club.ts # 社团API
│ ├── activity.ts # 活动API
│ └── attendance.ts # 考勤API
├── views/ # 页面组件
│ ├── club/ # 社团管理页面
│ ├── activity/ # 活动管理页面
│ └── attendance/ # 考勤管理页面
├── components/ # 通用组件
│ ├── ClubSelector/ # 社团选择器
│ ├── ActivityCard/ # 活动卡片
│ └── AttendanceMap/ # 签到地图
├── stores/ # 状态管理
│ ├── club.ts # 社团状态
│ └── activity.ts # 活动状态
├── types/ # TypeScript类型定义
│ ├── club.ts # 社团类型
│ └── activity.ts # 活动类型
└── utils/ # 工具函数
├── request.ts # HTTP请求
└── common.ts # 通用工具
```
### 4.2 核心组件设计
#### 社团管理组件
```vue
<!-- ClubManagement.vue -->
<template>
<div class="club-management">
<el-card>
<template #header>
<div class="card-header">
<span>社团管理</span>
<el-button type="primary" @click="handleCreate">新增社团</el-button>
</div>
</template>
<!-- 查询条件 -->
<el-form :model="queryForm" inline>
<el-form-item label="社团名称">
<el-input v-model="queryForm.clubName" placeholder="请输入社团名称" />
</el-form-item>
<el-form-item label="社团类型">
<el-select v-model="queryForm.clubType" placeholder="请选择">
<el-option v-for="item in clubTypes" :key="item.value"
:label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
<!-- 数据表格 -->
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="clubName" label="社团名称" />
<el-table-column prop="clubType" label="社团类型" />
<el-table-column prop="presidentName" label="社长" />
<el-table-column prop="memberCount" label="成员数量" />
<el-table-column prop="status" label="状态">
<template #default="scope">
<el-tag :type="scope.row.status === 1 ? 'success' : 'danger'">
{{ scope.row.status === 1 ? '正常' : '停用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template #default="scope">
<el-button type="primary" size="small" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="success" size="small" @click="handleMembers(scope.row)">成员</el-button>
<el-button type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<el-pagination
v-model:current-page="pagination.current"
v-model:page-size="pagination.size"
:total="pagination.total"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleQuery"
@current-change="handleQuery"
/>
</el-card>
<!-- 新增/编辑对话框 -->
<ClubDialog v-model:visible="dialogVisible" :club-id="currentClubId" @success="handleQuery" />
</div>
</template>
```
#### 活动管理组件
```vue
<!-- ActivityManagement.vue -->
<template>
<div class="activity-management">
<!-- 筛选区域 -->
<el-card class="filter-card">
<el-form :model="queryForm" inline>
<el-form-item label="活动名称">
<el-input v-model="queryForm.activityName" placeholder="请输入活动名称" />
</el-form-item>
<el-form-item label="活动类型">
<el-select v-model="queryForm.activityType" placeholder="请选择">
<el-option v-for="item in activityTypes" :key="item.value"
:label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="活动状态">
<el-select v-model="queryForm.activityStatus" placeholder="请选择">
<el-option v-for="item in activityStatuses" :key="item.value"
:label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="活动时间">
<el-date-picker
v-model="queryForm.dateRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 活动列表 -->
<el-card>
<template #header>
<div class="card-header">
<span>活动列表</span>
<div>
<el-button type="primary" @click="handleCreate">新增活动</el-button>
<el-button type="success" @click="handleExport">导出</el-button>
</div>
</div>
</template>
<!-- 活动卡片 -->
<div class="activity-grid">
<ActivityCard
v-for="activity in activityList"
:key="activity.id"
:activity="activity"
@edit="handleEdit"
@copy="handleCopy"
@delete="handleDelete"
@view-registration="handleViewRegistration"
/>
</div>
<!-- 分页 -->
<el-pagination
v-model:current-page="pagination.current"
v-model:page-size="pagination.size"
:total="pagination.total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleQuery"
@current-change="handleQuery"
/>
</el-card>
</div>
</template>
```
### 4.3 状态管理设计
#### Pinia Store 设计
```typescript
// stores/club.ts
export const useClubStore = defineStore('club', {
state: () => ({
clubList: [] as Club[],
currentClub: null as Club | null,
loading: false,
clubTypes: [
{ label: '学术科技类', value: '学术科技类' },
{ label: '文化艺术类', value: '文化艺术类' },
{ label: '体育健身类', value: '体育健身类' },
{ label: '实践技能类', value: '实践技能类' },
{ label: '兴趣爱好类', value: '兴趣爱好类' },
{ label: '思想政治类', value: '思想政治类' }
]
}),
actions: {
async fetchClubList(params: ClubQueryParams) {
this.loading = true
try {
const response = await getClubList(params)
this.clubList = response.data.rows
return response.data
} finally {
this.loading = false
}
},
async createClub(club: ClubCreateDto) {
const response = await createClub(club)
if (response.code === 200) {
ElMessage.success('创建成功')
await this.fetchClubList({})
}
return response
}
}
})
```
## 5. 移动端架构设计
### 5.1 uni-app + uview-plus 架构
```
pages/
├── club/ # 社团页面
│ ├── list.vue # 社团列表
│ ├── detail.vue # 社团详情
│ └── join.vue # 加入社团
├── activity/ # 活动页面
│ ├── list.vue # 活动列表
│ ├── detail.vue # 活动详情
│ └── register.vue # 活动报名
└── attendance/ # 考勤页面
├── list.vue # 考勤列表
└── checkin.vue # 签到页面
components/
├── club-card/ # 社团卡片组件
├── activity-card/ # 活动卡片组件
└── map-checkin/ # 地图签到组件
utils/
├── request.js # 网络请求
├── location.js # 地理位置
└── storage.js # 本地存储
```
### 5.2 地理位置签到组件
```vue
<!-- components/map-checkin/index.vue -->
<template>
<view class="map-checkin">
<map
:latitude="location.latitude"
:longitude="location.longitude"
:markers="markers"
:circles="circles"
show-location
@tap="onMapTap"
/>
<view class="checkin-info">
<view class="distance">距离签到点: {{ distance }}米</view>
<view class="address">当前位置: {{ address }}</view>
</view>
<view class="checkin-actions">
<u-button
type="primary"
size="large"
:disabled="!canCheckin"
@click="handleCheckin"
>
{{ canCheckin ? '签到' : '超出签到范围' }}
</u-button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
location: { latitude: 0, longitude: 0 },
targetLocation: { latitude: 0, longitude: 0 },
distance: 0,
address: '',
canCheckin: false,
allowRange: 500 // 允许签到范围(米)
}
},
onLoad() {
this.getCurrentLocation()
},
methods: {
async getCurrentLocation() {
try {
const res = await uni.getLocation({
type: 'gcj02'
})
this.location = {
latitude: res.latitude,
longitude: res.longitude
}
this.calculateDistance()
this.getAddress()
} catch (error) {
uni.showToast({
title: '获取位置失败',
icon: 'error'
})
}
},
calculateDistance() {
// 计算两点间距离
const distance = this.getDistance(
this.location.latitude,
this.location.longitude,
this.targetLocation.latitude,
this.targetLocation.longitude
)
this.distance = Math.round(distance)
this.canCheckin = distance <= this.allowRange
},
async handleCheckin() {
if (!this.canCheckin) {
uni.showToast({
title: '超出签到范围',
icon: 'error'
})
return
}
try {
const response = await this.$request.post('/api/stgl/attendance/checkin', {
taskId: this.taskId,
latitude: this.location.latitude,
longitude: this.location.longitude,
address: this.address
})
if (response.code === 200) {
uni.showToast({
title: '签到成功',
icon: 'success'
})
setTimeout(() => {
uni.navigateBack()
}, 2000)
}
} catch (error) {
uni.showToast({
title: '签到失败',
icon: 'error'
})
}
}
}
}
</script>
```
## 6. 系统集成方案
### 6.1 学生信息系统集成
```java
@Component
public class StudentInfoIntegration {
@Autowired
private SysUserMapper userMapper;
@Autowired
private XgStudentMapper studentMapper;
@Autowired
private XgClassMapper classMapper;
/**
* 获取学生信息
*/
public StudentVo getStudentInfo(String studentNo) {
// 从用户表获取基础信息
SysUser user = userMapper.selectByUserName(studentNo);
if (user == null) {
throw new ServiceException("用户不存在");
}
// 从学生表获取详细信息
XgStudent student = studentMapper.selectByStudentNo(studentNo);
if (student == null) {
throw new ServiceException("学生信息不存在");
}
// 从班级表获取班级信息
XgClass classInfo = classMapper.selectById(student.getClassId());
// 组装返回数据
StudentVo studentVo = new StudentVo();
BeanUtils.copyProperties(user, studentVo);
BeanUtils.copyProperties(student, studentVo);
if (classInfo != null) {
studentVo.setClassName(classInfo.getClassName());
studentVo.setMajorName(classInfo.getMajorName());
}
return studentVo;
}
/**
* 批量获取班级学生
*/
public List<StudentVo> getClassStudents(Long classId) {
List<XgStudent> students = studentMapper.selectByClassId(classId);
return students.stream()
.map(student -> getStudentInfo(student.getStudentNo()))
.collect(Collectors.toList());
}
}
```
### 6.2 通知系统集成
```java
@Component
public class NotificationIntegration {
@Autowired
private MessageService messageService;
/**
* 发送活动通知
*/
public void sendActivityNotification(Long activityId, List<Long> userIds, String type) {
Activity activity = activityService.getById(activityId);
String title;
String content;
switch (type) {
case "CREATE":
title = "新活动通知";
content = String.format("【%s】活动已发布,报名时间:%s - %s",
activity.getActivityName(),
DateUtils.formatDateTime(activity.getRegistrationStart()),
DateUtils.formatDateTime(activity.getRegistrationEnd()));
break;
case "APPROVAL":
title = "报名审核通知";
content = String.format("您报名的【%s】活动审核已通过", activity.getActivityName());
break;
case "CHECKIN":
title = "签到提醒";
content = String.format("【%s】活动签到已开始,请及时签到", activity.getActivityName());
break;
default:
return;
}
// 发送消息
MessageDto messageDto = new MessageDto();
messageDto.setTitle(title);
messageDto.setContent(content);
messageDto.setType("SYSTEM");
messageDto.setUserIds(userIds);
messageService.sendMessage(messageDto);
}
}
```
## 7. 性能优化方案
### 7.1 数据库优化
- **分页查询优化**: 使用覆盖索引避免回表
- **批量操作优化**: 使用MyBatis批量插入/更新
- **慢查询监控**: 启用MySQL慢查询日志
- **连接池优化**: 合理配置HikariCP参数
### 7.2 缓存策略
```java
@Service
public class ClubService {
@Cacheable(value = "club", key = "#id")
public ClubVo getClubById(Long id) {
// 查询数据库
}
@CacheEvict(value = "club", key = "#clubDto.id")
public void updateClub(ClubUpdateDto clubDto) {
// 更新数据库
}
@Cacheable(value = "club:list", key = "#queryDto.hashCode()")
public List<ClubVo> getClubList(ClubQueryDto queryDto) {
// 查询数据库
}
}
```
### 7.3 前端性能优化
- **组件懒加载**: 使用Vue 3的defineAsyncComponent
- **图片懒加载**: 活动海报、社团logo延迟加载
- **虚拟滚动**: 大列表使用虚拟滚动组件
- **资源预加载**: 关键路由和组件预加载
## 8. 安全设计方案
### 8.1 认证授权
```java
@RestController
@RequestMapping("/api/stgl/club")
public class ClubController {
@GetMapping("/list")
@SaCheckPermission("stgl:club:list")
public TableDataInfo list(ClubQueryDto queryDto) {
// 权限检查通过后执行业务逻辑
}
@PostMapping
@SaCheckPermission("stgl:club:create")
public R<Void> create(@Valid @RequestBody ClubCreateDto createDto) {
// 创建社团
}
}
```
### 8.2 数据权限
```java
@Component
public class DataPermissionHandler {
/**
* 根据用户权限过滤数据
*/
public void filterDataByPermission(QueryWrapper<?> queryWrapper) {
Long userId = SecurityUtils.getUserId();
String userType = SecurityUtils.getUserType();
if ("student".equals(userType)) {
// 学生只能看到自己参与的社团/活动
queryWrapper.eq("create_by", userId)
.or()
.exists("SELECT 1 FROM stgl_member WHERE relation_id = stgl_club.id AND user_id = " + userId);
} else if ("teacher".equals(userType)) {
// 老师可以看到自己指导的社团/活动
queryWrapper.like("advisor_name", SecurityUtils.getUsername());
}
// 管理员可以看到所有数据,不需要额外过滤
}
}
```
## 9. 部署方案
### 9.1 Docker容器化
```dockerfile
# Dockerfile for Backend
FROM openjdk:17-jdk-alpine
VOLUME /tmp
COPY target/club-management.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# Dockerfile for Frontend
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=0 /app/dist /usr/share/nginx/html
```
### 9.2 监控方案
- **应用监控**: Spring Boot Actuator + Micrometer
- **日志监控**: ELK Stack (Elasticsearch + Logstash + Kibana)
- **性能监控**: Prometheus + Grafana
- **错误追踪**: Sentry或自建错误收集系统
这个技术架构设计为社团管理系统的开发提供了完整的技术指导,涵盖了从数据库设计到前后端架构、系统集成、性能优化等各个方面。请根据实际项目需求进行适当调整。
@@ -0,0 +1,366 @@
# 社团管理系统需求说明
## 1. 项目定位
- **一级模块**:社团管理系统(Club Management System)
- **功能标识前缀**:stgl_(社团管理-sheTuanGuanLi)
- **技术架构**:前后端分离 + 移动端
- **主要角色**:社团管理员、指导老师、社长、副社长、成员、学生
## 2. 业务背景与目标
### 2.1 业务背景
校园社团管理需要支持社团创建、活动组织、成员管理、考勤签到、材料收集等全流程管理,同时支持志愿者队伍管理,提升校园社团活动的组织效率和管理水平。
### 2.2 业务目标
- 建立完整的社团信息管理体系
- 支持灵活的活动创建、报名、审批流程
- 实现地理位置签到和考勤管理
- 提供多维度的材料收集功能
- 支持活动评分和质量评估
- 建立数据权限和角色权限体系
## 3. 主要功能模块
### 3.1 社团基础管理
- **社团信息管理**:创建、编辑、删除、转让社团
- **成员管理**:支持单个/批量导入成员,角色分配(社长、副社长、成员)
- **权限管理**:指导老师可授权不同人员负责社团活动创建和审批
- **信息查看**:支持查看社团信息、成员信息
### 3.2 志愿者队伍管理
- **队伍管理**:新增、编辑、删除、转让志愿者队伍
- **成员管理**:支持单个/批量导入志愿者成员
- **信息查看**:支持查看志愿者队伍信息
### 3.3 活动管理
- **活动创建**:支持活动创建、导出、复制功能
- **信息管理**:包含基本信息、主办承办方、指导老师、报名设置等
- **筛选功能**:根据名称、主办方、承办方、活动状态、日期等筛选
- **审批流程**:活动审批流程跟踪(暂不挂工作流)
- **评分管理**:查看用户对活动的评分情况(5分制,1-5星评分)
### 3.4 报名管理
- **报名功能**:学生报名社团、志愿者队伍、活动
- **报名方式**:支持个人报名和团队报名
- **审核管理**:支持报名审核(保存、提交、审核功能)
- **材料查看**:支持团队报名材料查看
### 3.5 考勤与签到管理
- **考勤任务**:考勤任务新建、停止等操作
- **签到功能**:支持地理位置签到
- Web端:仅更改签到状态,不记录位置
- 移动端:记录签到状态和签到位置
- **数据管理**:根据名称、活动状态等筛选考勤数据
- **统计导出**:完成从任务发起、学生打卡、结束到数据统计导出的全流程
### 3.6 材料收集管理
- **收集设置**:活动过程自定义收集材料(文本、附件、图片)
- **多轮收集**:支持多次收集、关闭或恢复材料征集
- **材料管理**:材料查看、状态管理
### 3.7 数据管理
- **导入导出**:支持Excel格式的导入导出
- **数据权限**:根据添加人或其所在组织划分数据权限
- **成员管理**:活动详情中可查看基本信息、成员获得成绩情况、添加或删除成员
## 4. 角色权限体系
### 4.1 角色定义
- **社团管理员**:系统级管理员,拥有所有功能权限
- **指导老师**:可授权人员负责社团活动创建和审批,分配社团成员管理权限
- **社长**:社团最高负责人,无特殊权限差异
- **副社长**:社团副负责人,无特殊权限差异
- **成员**:普通社团成员,无特殊权限差异
- **学生**:可报名参加社团、活动
- **班主任**:有权限查看自己班级学生社团参与情况
### 4.2 权限说明
- 社团内部角色(社长、副社长、成员)暂无权限差异
- 权限管理通过系统管理-角色管理中增加角色,为角色分配用户实现
- 数据权限按照添加人或其所在组织进行划分
## 5. 数据结构设计
### 5.1 基础字段要求
所有业务表必须包含以下标准字段(顺序和类型完全一致):
```sql
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)'
```
### 5.2 社团信息表(stgl_club)
#### 基本信息字段
- `club_name` varchar(100) NOT NULL COMMENT '社团名称(唯一)'
- `club_type` varchar(50) NOT NULL COMMENT '社团类型'
- `establish_date` date COMMENT '成立日期'
- `description` text COMMENT '社团简介(500字以内)'
- `email` varchar(100) COMMENT '邮箱'
- `phone` varchar(20) COMMENT '电话'
- `logo_url` varchar(500) COMMENT 'logo图片路径'
#### 管理人员信息
- `president_name` varchar(50) COMMENT '社长姓名'
- `president_student_no` varchar(20) COMMENT '社长学号'
- `president_dept` varchar(100) COMMENT '社长院系'
- `president_major` varchar(100) COMMENT '社长专业'
- `president_class` varchar(100) COMMENT '社长班级'
- `president_phone` varchar(20) COMMENT '社长联系方式'
- `vice_president_name` varchar(50) COMMENT '副社长姓名'
- `vice_president_student_no` varchar(20) COMMENT '副社长学号'
- `advisor_name` varchar(50) COMMENT '指导老师姓名'
- `advisor_dept` varchar(100) COMMENT '指导老师所属院系'
#### 运营信息
- `member_limit` int DEFAULT 0 COMMENT '成员规模上限'
- `departments` text COMMENT '组织架构(部门设置及职责)'
- `recruit_cycle` varchar(50) COMMENT '招新周期'
- `recruit_time` varchar(50) COMMENT '招新时间'
- `activity_frequency` varchar(50) COMMENT '活动频率'
- `funding_sources` varchar(200) COMMENT '经费来源(多选)'
- `charter_url` varchar(500) COMMENT '章程文档路径'
- `honors` text COMMENT '历史荣誉'
- `status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-停用)'
#### 社团类型码表值
- 学术科技类
- 文化艺术类
- 体育健身类
- 实践技能类
- 兴趣爱好类
- 思想政治类
### 5.3 活动信息表(stgl_activity)
#### 基本信息
- `activity_name` varchar(100) NOT NULL COMMENT '活动名称'
- `activity_type` varchar(50) NOT NULL COMMENT '活动类型'
- `activity_theme` varchar(100) COMMENT '活动主题'
- `start_time` datetime COMMENT '开始时间'
- `end_time` datetime COMMENT '结束时间'
- `location` varchar(200) COMMENT '活动地点'
- `description` text COMMENT '活动简介(1000字以内)'
- `poster_url` varchar(500) COMMENT '活动海报路径'
- `related_club_id` bigint(20) COMMENT '关联社团ID'
#### 主办承办方信息
- `organizer_name` varchar(100) COMMENT '主办方名称'
- `organizer_type` varchar(50) COMMENT '主办方类型'
- `organizer_contact` varchar(100) COMMENT '主办方联系人'
- `organizer_phone` varchar(20) COMMENT '主办方电话'
- `co_organizers` text COMMENT '承办方信息(JSON格式存储多个承办方)'
#### 指导老师信息
- `instructors` text COMMENT '指导老师列表(JSON格式)'
#### 报名管理信息
- `registration_type` tinyint COMMENT '报名方式(1-个人 2-团队 3-两者均可)'
- `registration_start` datetime COMMENT '报名开始时间'
- `registration_end` datetime COMMENT '报名结束时间'
- `registration_status` tinyint COMMENT '报名状态(0-未开始 1-报名中 2-已截止 3-已关闭)'
- `max_participants` int COMMENT '总人数上限'
- `max_teams` int COMMENT '团队数量上限'
- `team_size_min` int COMMENT '每队最小人数'
- `team_size_max` int COMMENT '每队最大人数'
- `need_approval` tinyint DEFAULT 0 COMMENT '是否需要审核(0-无需 1-需要)'
#### 活动状态信息
- `activity_status` varchar(20) COMMENT '活动状态'
- `is_finished` tinyint DEFAULT 0 COMMENT '是否为已办活动'
- `summary` text COMMENT '活动总结报告'
- `achievements` text COMMENT '活动成果'
- `import_source` varchar(200) COMMENT '导入来源信息'
#### 活动类型码表值
- 学术科技类
- 文化艺术类
- 体育健身类
- 志愿公益类
- 实践技能类
- 兴趣爱好类
- 思想政治类
#### 活动状态码表值
- 筹备中
- 待审批
- 已通过
- 进行中
- 已结束
- 已取消
- 已驳回
### 5.4 志愿者队伍表(stgl_volunteer_team)
#### 基本信息
- `team_name` varchar(100) NOT NULL COMMENT '队伍名称'
- `team_type` varchar(50) COMMENT '队伍类型'
- `description` text COMMENT '队伍简介'
- `leader_name` varchar(50) COMMENT '队长姓名'
- `leader_student_no` varchar(20) COMMENT '队长学号'
- `advisor_name` varchar(50) COMMENT '指导老师'
- `member_limit` int DEFAULT 0 COMMENT '成员上限'
- `status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-停用)'
### 5.5 成员关系表(stgl_member)
- `member_type` tinyint COMMENT '成员类型(1-社团成员 2-志愿者)'
- `relation_id` bigint(20) COMMENT '关联ID(社团ID或志愿者队伍ID)'
- `user_id` bigint(20) COMMENT '用户ID'
- `student_no` varchar(20) COMMENT '学号'
- `student_name` varchar(50) COMMENT '学生姓名'
- `role_type` tinyint COMMENT '角色类型(1-社长 2-副社长 3-成员)'
- `join_time` datetime COMMENT '加入时间'
- `status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-退出)'
### 5.6 活动报名表(stgl_activity_registration)
#### 基本信息
- `activity_id` bigint(20) NOT NULL COMMENT '活动ID'
- `user_id` bigint(20) COMMENT '用户ID'
- `student_no` varchar(20) COMMENT '学号'
- `student_name` varchar(50) COMMENT '学生姓名'
- `registration_type` tinyint COMMENT '报名类型(1-个人 2-团队)'
- `team_id` bigint(20) COMMENT '团队ID(团队报名时)'
- `team_name` varchar(100) COMMENT '团队名称'
- `registration_time` datetime COMMENT '报名时间'
- `approval_status` tinyint COMMENT '审核状态(0-待审核 1-通过 2-驳回)'
- `approval_time` datetime COMMENT '审核时间'
- `approval_remark` varchar(500) COMMENT '审核意见'
- `score` varchar(50) COMMENT '获得成绩'
- `score_time` datetime COMMENT '成绩录入时间'
### 5.7 考勤任务表(stgl_attendance_task)
- `activity_id` bigint(20) COMMENT '关联活动ID'
- `task_name` varchar(100) COMMENT '考勤任务名称'
- `task_status` tinyint COMMENT '任务状态(0-未发起 1-进行中 2-已停止 3-已结束)'
- `start_time` datetime COMMENT '签到开始时间'
- `end_time` datetime COMMENT '签到结束时间'
- `location_required` tinyint DEFAULT 0 COMMENT '是否需要地理位置(0-否 1-是)'
- `check_location` varchar(200) COMMENT '签到地点'
- `location_range` int DEFAULT 500 COMMENT '允许签到范围(米)'
### 5.8 签到记录表(stgl_attendance_record)
- `task_id` bigint(20) COMMENT '考勤任务ID'
- `user_id` bigint(20) COMMENT '用户ID'
- `student_no` varchar(20) COMMENT '学号'
- `student_name` varchar(50) COMMENT '学生姓名'
- `check_time` datetime COMMENT '签到时间'
- `check_status` tinyint COMMENT '签到状态(1-已签到 2-迟到 0-未签到)'
- `check_location` varchar(100) COMMENT '签到位置(经纬度)'
- `device_type` tinyint COMMENT '设备类型(1-Web 2-移动端)'
### 5.9 材料收集任务表(stgl_material_task)
- `activity_id` bigint(20) COMMENT '关联活动ID'
- `task_name` varchar(100) COMMENT '收集任务名称'
- `collection_types` varchar(100) COMMENT '收集类型(文本,附件,图片)'
- `task_description` text COMMENT '收集说明'
- `task_status` tinyint COMMENT '任务状态(1-开启 0-关闭)'
- `deadline` datetime COMMENT '截止时间'
- `round_number` int DEFAULT 1 COMMENT '收集轮次'
### 5.10 材料提交记录表(stgl_material_submission)
- `task_id` bigint(20) COMMENT '收集任务ID'
- `user_id` bigint(20) COMMENT '提交人ID'
- `submission_type` tinyint COMMENT '提交类型(1-个人 2-团队)'
- `content_text` text COMMENT '文本内容'
- `file_urls` text COMMENT '附件路径(JSON格式)'
- `image_urls` text COMMENT '图片路径(JSON格式)'
- `submission_time` datetime COMMENT '提交时间'
- `round_number` int DEFAULT 1 COMMENT '提交轮次'
### 5.11 活动评分表(stgl_activity_rating)
- `activity_id` bigint(20) COMMENT '活动ID'
- `user_id` bigint(20) COMMENT '评分人ID'
- `rating_score` tinyint COMMENT '评分(1-5分)'
- `rating_comment` varchar(500) COMMENT '评分备注'
- `rating_time` datetime COMMENT '评分时间'
## 6. 系统集成需求
### 6.1 学生信息系统集成
- **班级信息**:集成班级表 `xg_class_msg`
- **学生信息**:集成学生信息表 `xg_student_msg`
- **用户信息**:集成用户表 `sys_user`
- **数据同步**:确保学生、班级信息的实时同步
### 6.2 通知系统集成
- **活动通知**:活动创建、开始、结束通知
- **报名结果通知**:报名审核结果通知
- **考勤提醒**:签到开始、结束提醒
- **材料收集通知**:材料征集开始、截止提醒
## 7. 技术架构要求
### 7.1 技术栈
- **前端**:Vue 3 + TypeScript + Element Plus
- **后端**:Spring Boot 3.4.6 + MyBatis-Plus
- **移动端**:Vue 3.4.21 + uni-app + uview-plus 3.4.45
- **数据库**:MySQL(遵循雪花ID、逻辑删除、多租户规范)
### 7.2 开发规范
- **数据库**:遵循标准基础字段、雪花ID主键、逻辑删除
- **API接口**:统一响应格式、Token认证、权限注解
- **文档管理**:代码变更必须同步更新API文档
- **导入导出**:统一使用Excel格式
### 7.3 部署要求
- **前端访问**:http://localhost (默认80端口)
- **后端服务**:http://localhost:8080
- **移动端**:支持H5、微信小程序、App等多端发布
## 8. 特殊要求
### 8.1 码表管理
- 所有码表数据直接存储在数据库中
- 不通过系统管理-字典管理配置
- 码表数据在建表SQL中直接初始化
### 8.2 地理位置签到
- **Web端**:仅更改签到状态,不记录地理位置
- **移动端**:记录签到状态和签到位置(经纬度)
- **位置验证**:支持设置签到范围,默认500米
### 8.3 工作流集成准备
- 当前版本不挂接工作流
- 预留工作流接口:保存、提交、审核功能按钮
- 后续版本通过"提交"按钮进入工作流
## 9. 开发优先级
### 9.1 第一阶段(核心功能)
1. 社团基础管理(社团信息、成员管理)
2. 活动管理(活动创建、基本信息管理)
3. 报名管理(个人报名、审核功能)
### 9.2 第二阶段(扩展功能)
1. 考勤签到管理
2. 材料收集管理
3. 活动评分系统
### 9.3 第三阶段(完善功能)
1. 志愿者队伍管理
2. 统计报表功能
3. 移动端功能完善
## 10. 验收标准
- ✅ 完整的社团管理功能(创建、编辑、成员管理)
- ✅ 活动全生命周期管理(创建、报名、考勤、评分)
- ✅ 地理位置签到功能(区分Web端和移动端)
- ✅ 材料收集和多轮征集功能
- ✅ Excel导入导出功能
- ✅ 完整的权限控制和数据权限
- ✅ 与学生信息系统和通知系统集成
- ✅ 符合项目开发规范和文档要求