676 lines
30 KiB
Markdown
676 lines
30 KiB
Markdown
# 社团管理数据库设计
|
||
|
||
## 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 缓存策略
|
||
- 社团信息、活动信息等相对稳定数据适合缓存
|
||
- 实时性要求高的签到、报名数据慎用缓存
|
||
- 统计数据可以使用定时刷新的缓存
|
||
|
||
这个数据库设计为社团管理系统提供了完整的数据存储方案,支持所有业务需求并具有良好的可扩展性和性能。 |