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

30 KiB
Raw Blame History

社团管理数据库设计

1. 设计概述

1.1 设计目标

设计一个完整的社团管理数据库系统,支持社团管理、活动组织、考勤签到、材料收集等全流程管理功能。

1.2 设计原则

  • 标准化: 所有表遵循统一的基础字段规范
  • 规范化: 避免数据冗余,合理设计表关系
  • 可扩展: 预留扩展字段,支持业务发展
  • 高性能: 合理设计索引,优化查询性能
  • 多租户: 支持多租户架构设计

1.3 命名规范

  • 表名前缀: stgl_(社团管理)
  • 字段命名: 采用下划线分隔的小写字母
  • 索引命名: idx_表名_字段名 或 uk_表名_字段名(唯一索引)

1.4 基础字段规范

所有业务表必须包含以下基础字段:

`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)

表结构

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)

表结构

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)

表结构

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)

表结构

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)

表结构

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)

表结构

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)

表结构

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)

表结构

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)

表结构

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)

表结构

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)

表结构

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 社团类型码表

-- 社团类型枚举值
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 活动类型码表

-- 活动类型枚举值
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 活动状态码表

-- 活动状态枚举值
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 缓存策略

  • 社团信息、活动信息等相对稳定数据适合缓存
  • 实时性要求高的签到、报名数据慎用缓存
  • 统计数据可以使用定时刷新的缓存

这个数据库设计为社团管理系统提供了完整的数据存储方案,支持所有业务需求并具有良好的可扩展性和性能。