更新心理健康模块配置和前端依赖
This commit is contained in:
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导入导出功能
|
||||
- ✅ 完整的权限控制和数据权限
|
||||
- ✅ 与学生信息系统和通知系统集成
|
||||
- ✅ 符合项目开发规范和文档要求
|
||||
Reference in new issue
Block a user