Files
hzdyjs/docs/设计文档/database/社团管理/社团管理数据库设计.md
T
2025-09-09 11:35:35 +08:00

676 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 社团管理数据库设计
## 1. 设计概述
### 1.1 设计目标
设计一个完整的社团管理数据库系统,支持社团管理、活动组织、考勤签到、材料收集等全流程管理功能。
### 1.2 设计原则
- **标准化**: 所有表遵循统一的基础字段规范
- **规范化**: 避免数据冗余,合理设计表关系
- **可扩展**: 预留扩展字段,支持业务发展
- **高性能**: 合理设计索引,优化查询性能
- **多租户**: 支持多租户架构设计
### 1.3 命名规范
- **表名前缀**: stgl_(社团管理)
- **字段命名**: 采用下划线分隔的小写字母
- **索引命名**: idx_表名_字段名 或 uk_表名_字段名(唯一索引)
### 1.4 基础字段规范
所有业务表必须包含以下基础字段:
```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代表删除)'
```
## 2. 数据表设计
### 2.1 社团信息表(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 '社团简介(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-停用)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_club_name` (`club_name`, `tenant_id`, `deleted`),
KEY `idx_club_type` (`club_type`),
KEY `idx_create_time` (`create_time`),
KEY `idx_status` (`status`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='社团信息表';
```
#### 字段说明
- `club_type`: 社团类型,枚举值见码表
- `status`: 1-正常,0-停用
- `funding_sources`: JSON格式存储多个经费来源
### 2.2 志愿者队伍表(stgl_volunteer_team)
#### 表结构
```sql
CREATE TABLE `stgl_volunteer_team` (
`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代表删除)',
-- 基本信息
`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 '队长学号',
`leader_user_id` bigint(20) COMMENT '队长用户ID',
`advisor_name` varchar(50) COMMENT '指导老师',
`member_limit` int DEFAULT 0 COMMENT '成员上限',
`status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-停用)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_team_name` (`team_name`, `tenant_id`, `deleted`),
KEY `idx_team_type` (`team_type`),
KEY `idx_leader_user_id` (`leader_user_id`),
KEY `idx_create_time` (`create_time`),
KEY `idx_status` (`status`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='志愿者队伍表';
```
### 2.3 成员关系表(stgl_member)
#### 表结构
```sql
CREATE TABLE `stgl_member` (
`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代表删除)',
-- 关系信息
`member_type` tinyint NOT NULL COMMENT '成员类型(1-社团成员 2-志愿者)',
`relation_id` bigint(20) NOT NULL COMMENT '关联ID(社团ID或志愿者队伍ID)',
`user_id` bigint(20) NOT NULL 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-退出)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_relation` (`member_type`, `relation_id`, `user_id`, `deleted`),
KEY `idx_member_type` (`member_type`),
KEY `idx_relation_id` (`relation_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_join_time` (`join_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成员关系表';
```
#### 字段说明
- `member_type`: 1-社团成员,2-志愿者
- `role_type`: 1-社长,2-副社长,3-成员
- `status`: 1-正常,0-退出
### 2.4 活动信息表(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 '活动简介(1000字以内)',
`poster_url` varchar(500) COMMENT '活动海报路径',
`related_dept_id` bigint(20) COMMENT '关联部门ID',
`related_dept_name` varchar(100) 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 '承办方信息(JSON格式存储多个承办方)',
`instructors` json 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) DEFAULT '筹备中' COMMENT '活动状态',
`is_finished` tinyint DEFAULT 0 COMMENT '是否为已办活动(0-否 1-是)',
`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_activity_status` (`activity_status`),
KEY `idx_registration_status` (`registration_status`),
KEY `idx_related_dept_id` (`related_dept_id`),
KEY `idx_related_club_id` (`related_club_id`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动信息表';
```
#### 字段说明
- `activity_type`: 活动类型,枚举值见码表
- `registration_type`: 1-个人,2-团队,3-两者均可
- `registration_status`: 0-未开始,1-报名中,2-已截止,3-已关闭
- `activity_status`: 筹备中、待审批、已通过、进行中、已结束、已取消、已驳回
- `need_approval`: 0-无需审核,1-需要审核
### 2.5 团队信息表(stgl_team_info)
#### 表结构
```sql
CREATE TABLE `stgl_team_info` (
`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代表删除)',
-- 团队信息
`team_name` varchar(100) NOT NULL COMMENT '团队名称',
`activity_id` bigint(20) NOT NULL COMMENT '关联活动ID',
`leader_user_id` bigint(20) NOT NULL COMMENT '队长用户ID',
`leader_name` varchar(50) COMMENT '队长姓名',
`leader_student_no` varchar(20) COMMENT '队长学号',
`team_members` json COMMENT '团队成员信息(JSON格式)',
`team_size` int DEFAULT 0 COMMENT '团队人数',
`description` text COMMENT '团队描述',
`status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-解散)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_team_activity` (`team_name`, `activity_id`, `deleted`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_leader_user_id` (`leader_user_id`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团队信息表';
```
### 2.6 活动报名表(stgl_activity_registration)
#### 表结构
```sql
CREATE TABLE `stgl_activity_registration` (
`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_id` bigint(20) NOT NULL COMMENT '活动ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
`registration_type` tinyint NOT NULL COMMENT '报名类型(1-个人 2-团队)',
`team_id` bigint(20) COMMENT '团队ID(团队报名时)',
`team_name` varchar(100) COMMENT '团队名称',
`registration_time` datetime COMMENT '报名时间',
-- 审核信息
`approval_status` tinyint DEFAULT 0 COMMENT '审核状态(0-待审核 1-通过 2-驳回)',
`approval_time` datetime COMMENT '审核时间',
`approval_by` bigint(20) COMMENT '审核人ID',
`approval_remark` varchar(500) COMMENT '审核意见',
-- 成绩信息
`score` varchar(50) COMMENT '获得成绩',
`score_time` datetime COMMENT '成绩录入时间',
`score_by` bigint(20) COMMENT '成绩录入人ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_activity_user` (`activity_id`, `user_id`, `deleted`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_registration_type` (`registration_type`),
KEY `idx_team_id` (`team_id`),
KEY `idx_approval_status` (`approval_status`),
KEY `idx_registration_time` (`registration_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动报名表';
```
#### 字段说明
- `registration_type`: 1-个人报名,2-团队报名
- `approval_status`: 0-待审核,1-通过,2-驳回
### 2.7 考勤任务表(stgl_attendance_task)
#### 表结构
```sql
CREATE TABLE `stgl_attendance_task` (
`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_id` bigint(20) NOT NULL COMMENT '关联活动ID',
`task_name` varchar(100) NOT NULL COMMENT '考勤任务名称',
`task_status` tinyint DEFAULT 0 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_latitude` decimal(10,7) COMMENT '签到地点纬度',
`location_longitude` decimal(10,7) COMMENT '签到地点经度',
`location_range` int DEFAULT 500 COMMENT '允许签到范围(米)',
-- 统计信息
`total_participants` int DEFAULT 0 COMMENT '应签到人数',
`checked_count` int DEFAULT 0 COMMENT '已签到人数',
`late_count` int DEFAULT 0 COMMENT '迟到人数',
`absent_count` int DEFAULT 0 COMMENT '缺席人数',
PRIMARY KEY (`id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_task_status` (`task_status`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤任务表';
```
#### 字段说明
- `task_status`: 0-未发起,1-进行中,2-已停止,3-已结束
- `location_required`: 0-不需要地理位置,1-需要地理位置
### 2.8 签到记录表(stgl_attendance_record)
#### 表结构
```sql
CREATE TABLE `stgl_attendance_record` (
`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代表删除)',
-- 签到记录信息
`task_id` bigint(20) NOT NULL COMMENT '考勤任务ID',
`activity_id` bigint(20) NOT NULL COMMENT '活动ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
-- 签到信息
`check_time` datetime COMMENT '签到时间',
`check_status` tinyint DEFAULT 0 COMMENT '签到状态(0-未签到 1-已签到 2-迟到)',
`check_latitude` decimal(10,7) COMMENT '签到纬度',
`check_longitude` decimal(10,7) COMMENT '签到经度',
`check_address` varchar(200) COMMENT '签到地址',
`device_type` tinyint COMMENT '设备类型(1-Web 2-移动端)',
`distance` int COMMENT '与标准位置距离(米)',
-- 签退信息(可选)
`checkout_time` datetime COMMENT '签退时间',
`checkout_latitude` decimal(10,7) COMMENT '签退纬度',
`checkout_longitude` decimal(10,7) COMMENT '签退经度',
`checkout_address` varchar(200) COMMENT '签退地址',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_user` (`task_id`, `user_id`, `deleted`),
KEY `idx_task_id` (`task_id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_check_status` (`check_status`),
KEY `idx_check_time` (`check_time`),
KEY `idx_device_type` (`device_type`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='签到记录表';
```
#### 字段说明
- `check_status`: 0-未签到,1-已签到,2-迟到
- `device_type`: 1-Web端,2-移动端
### 2.9 材料收集任务表(stgl_material_task)
#### 表结构
```sql
CREATE TABLE `stgl_material_task` (
`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_id` bigint(20) NOT NULL COMMENT '关联活动ID',
`task_name` varchar(100) NOT NULL COMMENT '收集任务名称',
`collection_types` varchar(100) NOT NULL COMMENT '收集类型(文本,附件,图片)',
`task_description` text COMMENT '收集说明',
`task_status` tinyint DEFAULT 1 COMMENT '任务状态(0-关闭 1-开启)',
`deadline` datetime COMMENT '截止时间',
`round_number` int DEFAULT 1 COMMENT '收集轮次',
-- 文件限制
`file_size_limit` int DEFAULT 10 COMMENT '文件大小限制(MB)',
`file_count_limit` int DEFAULT 5 COMMENT '文件数量限制',
`allowed_file_types` varchar(200) COMMENT '允许的文件类型',
-- 统计信息
`total_participants` int DEFAULT 0 COMMENT '应提交人数',
`submitted_count` int DEFAULT 0 COMMENT '已提交人数',
`pending_count` int DEFAULT 0 COMMENT '待提交人数',
PRIMARY KEY (`id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_task_status` (`task_status`),
KEY `idx_deadline` (`deadline`),
KEY `idx_round_number` (`round_number`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='材料收集任务表';
```
#### 字段说明
- `collection_types`: 逗号分隔,如:文本,附件,图片
- `task_status`: 0-关闭,1-开启
### 2.10 材料提交记录表(stgl_material_submission)
#### 表结构
```sql
CREATE TABLE `stgl_material_submission` (
`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代表删除)',
-- 提交记录信息
`task_id` bigint(20) NOT NULL COMMENT '收集任务ID',
`activity_id` bigint(20) NOT NULL COMMENT '活动ID',
`user_id` bigint(20) NOT NULL COMMENT '提交人ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
`submission_type` tinyint NOT NULL COMMENT '提交类型(1-个人 2-团队)',
`team_id` bigint(20) COMMENT '团队ID(团队提交时)',
-- 提交内容
`content_text` text COMMENT '文本内容',
`file_urls` json COMMENT '附件路径(JSON格式)',
`image_urls` json COMMENT '图片路径(JSON格式)',
`submission_time` datetime COMMENT '提交时间',
`round_number` int DEFAULT 1 COMMENT '提交轮次',
-- 审核信息(可选)
`review_status` tinyint DEFAULT 0 COMMENT '审核状态(0-待审核 1-通过 2-需修改)',
`review_time` datetime COMMENT '审核时间',
`review_by` bigint(20) COMMENT '审核人ID',
`review_remark` varchar(500) COMMENT '审核意见',
PRIMARY KEY (`id`),
KEY `idx_task_id` (`task_id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_submission_type` (`submission_type`),
KEY `idx_team_id` (`team_id`),
KEY `idx_submission_time` (`submission_time`),
KEY `idx_round_number` (`round_number`),
KEY `idx_review_status` (`review_status`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='材料提交记录表';
```
#### 字段说明
- `submission_type`: 1-个人提交,2-团队提交
- `review_status`: 0-待审核,1-通过,2-需修改
### 2.11 活动评分表(stgl_activity_rating)
#### 表结构
```sql
CREATE TABLE `stgl_activity_rating` (
`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_id` bigint(20) NOT NULL COMMENT '活动ID',
`user_id` bigint(20) NOT NULL COMMENT '评分人ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
`rating_score` decimal(3,1) NOT NULL COMMENT '综合评分(1-5分,保留1位小数)',
`rating_comment` varchar(500) COMMENT '评分备注',
`rating_time` datetime COMMENT '评分时间',
-- 扩展评分维度(预留)
`content_score` tinyint COMMENT '内容评分(1-5分)',
`organization_score` tinyint COMMENT '组织评分(1-5分)',
`experience_score` tinyint COMMENT '体验评分(1-5分)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_activity_user` (`activity_id`, `user_id`, `deleted`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_rating_score` (`rating_score`),
KEY `idx_rating_time` (`rating_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动评分表';
```
#### 字段说明
- `rating_score`: 综合评分,1-5分,保留1位小数,由三项分评分平均值计算得出
- `content_score`、`organization_score`、`experience_score`: 三项分评分维度(内容、组织、体验),1-5分整数
- 综合评分计算公式:`rating_score = ROUND((content_score + organization_score + experience_score) / 3, 1)`
## 3. 码表数据设计
### 3.1 社团类型码表
```sql
-- 社团类型枚举值
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time) VALUES ('社团类型', 'stgl_club_type', '0', 1, NOW());
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time) VALUES
(1, '学术科技类', '学术科技类', 'stgl_club_type', '0', 1, NOW()),
(2, '文化艺术类', '文化艺术类', 'stgl_club_type', '0', 1, NOW()),
(3, '体育健身类', '体育健身类', 'stgl_club_type', '0', 1, NOW()),
(4, '实践技能类', '实践技能类', 'stgl_club_type', '0', 1, NOW()),
(5, '兴趣爱好类', '兴趣爱好类', 'stgl_club_type', '0', 1, NOW()),
(6, '思想政治类', '思想政治类', 'stgl_club_type', '0', 1, NOW());
```
### 3.2 活动类型码表
```sql
-- 活动类型枚举值
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time) VALUES ('活动类型', 'stgl_activity_type', '0', 1, NOW());
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time) VALUES
(1, '学术科技类', '学术科技类', 'stgl_activity_type', '0', 1, NOW()),
(2, '文化艺术类', '文化艺术类', 'stgl_activity_type', '0', 1, NOW()),
(3, '体育健身类', '体育健身类', 'stgl_activity_type', '0', 1, NOW()),
(4, '志愿公益类', '志愿公益类', 'stgl_activity_type', '0', 1, NOW()),
(5, '实践技能类', '实践技能类', 'stgl_activity_type', '0', 1, NOW()),
(6, '兴趣爱好类', '兴趣爱好类', 'stgl_activity_type', '0', 1, NOW()),
(7, '思想政治类', '思想政治类', 'stgl_activity_type', '0', 1, NOW());
```
### 3.3 活动状态码表
```sql
-- 活动状态枚举值
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time) VALUES ('活动状态', 'stgl_activity_status', '0', 1, NOW());
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time) VALUES
(1, '筹备中', '筹备中', 'stgl_activity_status', '0', 1, NOW()),
(2, '待审批', '待审批', 'stgl_activity_status', '0', 1, NOW()),
(3, '已通过', '已通过', 'stgl_activity_status', '0', 1, NOW()),
(4, '进行中', '进行中', 'stgl_activity_status', '0', 1, NOW()),
(5, '已结束', '已结束', 'stgl_activity_status', '0', 1, NOW()),
(6, '已取消', '已取消', 'stgl_activity_status', '0', 1, NOW()),
(7, '已驳回', '已驳回', 'stgl_activity_status', '0', 1, NOW());
```
## 4. 索引优化策略
### 4.1 索引设计原则
- **主键索引**: 所有表使用bigint类型的雪花ID作为主键
- **唯一索引**: 对业务唯一性约束添加唯一索引
- **复合索引**: tenant_id + deleted 支持多租户和软删除
- **查询索引**: 针对常用查询条件添加索引
- **时间索引**: 时间字段添加索引支持时间范围查询
### 4.2 重要索引说明
1. **社团名称唯一性**: `uk_club_name` 确保同租户下社团名称唯一
2. **活动查询优化**: 多个时间和状态索引支持复杂查询
3. **报名记录唯一性**: `uk_activity_user` 确保用户不能重复报名同一活动
4. **签到记录唯一性**: `uk_task_user` 确保用户不能重复签到同一任务
5. **评分记录唯一性**: `uk_activity_user` 确保用户不能重复评分同一活动
## 5. 数据完整性约束
### 5.1 外键关系
- `stgl_member.relation_id` → `stgl_club.id` 或 `stgl_volunteer_team.id`
- `stgl_activity.related_club_id` → `stgl_club.id`
- `stgl_activity_registration.activity_id` → `stgl_activity.id`
- `stgl_activity_registration.team_id` → `stgl_team_info.id`
- `stgl_attendance_task.activity_id` → `stgl_activity.id`
- `stgl_attendance_record.task_id` → `stgl_attendance_task.id`
- `stgl_material_task.activity_id` → `stgl_activity.id`
- `stgl_material_submission.task_id` → `stgl_material_task.id`
- `stgl_activity_rating.activity_id` → `stgl_activity.id`
### 5.2 业务约束
- 社团名称在同一租户下必须唯一
- 用户不能重复报名同一活动
- 用户不能重复签到同一考勤任务
- 用户不能重复评分同一活动
- 团队成员数量不能超过活动设置的上限
## 6. 性能优化建议
### 6.1 查询优化
- 分页查询使用覆盖索引避免回表
- 复杂统计查询考虑创建物化视图
- JSON字段查询使用虚拟列索引
- 时间范围查询合理使用分区表
### 6.2 存储优化
- 大文本字段(description、summary等)考虑分离存储
- 图片和文件路径使用相对路径减少存储
- JSON字段压缩存储减少空间占用
### 6.3 缓存策略
- 社团信息、活动信息等相对稳定数据适合缓存
- 实时性要求高的签到、报名数据慎用缓存
- 统计数据可以使用定时刷新的缓存
这个数据库设计为社团管理系统提供了完整的数据存储方案,支持所有业务需求并具有良好的可扩展性和性能。