学生成绩管理系统V1.0(专科毕业设计满分级商用落地版本)
随着教育信息化深度推进,院校学生规模、课程种类持续扩张,成绩数据呈现海量增长、维度多元的特征。传统人工记录、Excel表格管理模式存在操作繁琐、统计低效、权限混乱、数据易丢失、信息传递滞后、无法深度分析等核心痛点;现有市面产品要么功能冗余、部署维护成本高,要么过于简易、无法适配国内院校本土化业务场景,轻量化、高可用、全流程覆盖的专用成绩管理系统存在明确的落地需求。
本项目所有技术栈均采用开源免费方案,无商用版权费用,开发仅需普通办公电脑即可完成,硬件与软件成本极低;系统投入使用后,可大幅降低教务人员、教师的人工操作成本,减少成绩管理的人力投入,长期收益显著,完全满足经济可行性要求。
前端采用Semi Design字节跳动企业级UI设计规范,界面交互符合国内中后台系统用户操作习惯,功能入口清晰,关键操作有引导提示,异常场景有友好反馈;教师端支持一键批量导入、自动核算成绩,学生端可一键查询成绩、导出成绩单,管理员端支持批量数据管理,无复杂操作门槛,适配院校师生的信息化操作水平,满足操作可行性。
本项目采用的技术栈均为行业成熟稳定的主流方案,拥有完善的官方文档、活跃的社区生态与大量最佳实践案例,技术落地无壁垒:
系统设计严格遵循《中华人民共和国个人信息保护法》《教育数据安全管理规范》等法律法规,通过数据加密存储、传输、脱敏展示、细粒度权限管控、全量操作日志审计等功能,保障学生个人信息与成绩数据的安全,留存日志满足合规要求,无法律合规风险。
系统采用RBAC(基于角色的访问控制)模型,设置4类核心角色,权限边界清晰,杜绝越权操作:
| 角色 | 核心权限范围 |
|---|---|
| 超级管理员 | 系统最高权限,负责全系统用户管理、组织架构管理、课程管理、系统配置、数据备份恢复、日志审计、全量数据查看与管理 |
| 院系管理员 | 所属院系的教师/学生账号管理、课程管理、数据统计、成绩监管,无系统全局配置权限 |
| 教师 | 个人授课课程管理、成绩录入/修改/发布、成绩统计分析、学生成绩申诉处理、班级通知发布 |
| 学生 | 个人信息管理、课程查询、个人成绩查询、成绩单导出、成绩申诉、个人学业分析 |
本模块为系统入口,集成Redis实现高性能会话管理,核心功能包括:
本模块为系统高性能、高并发的核心支撑,Redis应用场景全落地,核心设计如下:
| 缓存分类 | 缓存Key设计 | 缓存内容 | 过期时间 | 更新策略 |
|---|---|---|---|---|
| 用户会话缓存 | user:session:{token} | 用户基本信息、角色权限、菜单列表 | 2小时 | 登录时写入,退出时删除;每次操作刷新过期时间 |
| 热点用户信息缓存 | user:info:{userId} | 用户基础信息、关联的教师/学生详情 | 1小时 | 用户信息修改时删除缓存,重新查询时写入 |
| 系统配置缓存 | sys:config:all | 全量系统配置项键值对 | 24小时 | 配置修改时全量更新缓存 |
| 课程信息缓存 | edu:course:{courseId} | 课程基础详情、授课教师信息 | 12小时 | 课程信息修改时删除缓存,重新查询写入 |
| 已发布成绩缓存 | edu:score:published:{studentId}:{semesterId} | 学生对应学期已发布的成绩列表 | 30分钟 | 成绩发布/修改时删除对应缓存 |
| 接口限流缓存 | rate:limit:{ip}:{api} | 接口请求次数 | 1分钟 | 滑动窗口限流,过期自动清理 |
| 分布式锁 | lock:{business}:{id} | 锁持有者信息 | 30秒(自动续期) | 业务执行完成释放,超时自动释放 |
Redis附加能力实现:
本系统采用前后端分离的B/S架构,分层设计清晰,各层解耦,具备高可维护性与可扩展性,整体架构从上到下分为6层,具体设计如下:
核心技术栈:React 18 + TypeScript + Semi Design + Vite + Axios + React Router v6 + ECharts + Redux Toolkit 模块拆分:
Semi Design落地规范:
核心技术栈:Python 3.10+ + Django 4.2 LTS + Django REST Framework + Celery 分层设计:
student_score_managementutf8mb4,排序规则:utf8mb4_unicode_ci| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键,用户ID |
| username | varchar | 50 | 否 | 是 | 是 | 登录用户名(学号/工号) |
| password | varchar | 255 | 否 | 是 | 否 | 加密存储的密码 |
| real_name | varchar | 20 | 否 | 是 | 否 | 用户真实姓名 |
| user_type | tinyint | 1 | 否 | 是 | 否 | 用户类型:1-超级管理员 2-院系管理员 3-教师 4-学生 |
| varchar | 100 | 否 | 是 | 是 | 电子邮箱,用于验证与密码重置 | |
| phone | varchar | 11 | 否 | 否 | 是 | 联系电话 |
| avatar | varchar | 255 | 否 | 否 | 否 | 头像地址 |
| status | tinyint | 1 | 否 | 是 | 否 | 账号状态:0-禁用 1-正常 2-锁定 |
| last_login_time | datetime | - | 否 | 否 | 否 | 最后登录时间 |
| last_login_ip | varchar | 50 | 否 | 否 | 否 | 最后登录IP |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除:0-未删除 1-已删除 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键,院系ID |
| dept_code | varchar | 20 | 否 | 是 | 是 | 院系编号 |
| dept_name | varchar | 50 | 否 | 是 | 是 | 院系名称 |
| parent_id | bigint | - | 否 | 否 | 否 | 父级ID,顶级院系为0 |
| sort | int | - | 否 | 是 | 否 | 排序序号 |
| description | text | - | 否 | 否 | 否 | 院系描述 |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键,专业ID |
| major_code | varchar | 20 | 否 | 是 | 是 | 专业编号 |
| major_name | varchar | 50 | 否 | 是 | 是 | 专业名称 |
| dept_id | bigint | - | 否 | 是 | 否 | 所属院系ID,关联sys_department.id |
| study_year | int | - | 否 | 是 | 否 | 学制(年) |
| description | text | - | 否 | 否 | 否 | 专业描述 |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键,班级ID |
| class_code | varchar | 20 | 否 | 是 | 是 | 班级编号 |
| class_name | varchar | 50 | 否 | 是 | 是 | 班级名称 |
| major_id | bigint | - | 否 | 是 | 否 | 所属专业ID,关联sys_major.id |
| dept_id | bigint | - | 否 | 是 | 否 | 所属院系ID |
| grade | int | - | 否 | 是 | 否 | 年级 |
| head_teacher_id | bigint | - | 否 | 否 | 否 | 班主任ID,关联sys_user.id |
| student_count | int | - | 否 | 是 | 否 | 学生人数 |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键 |
| academic_year | varchar | 20 | 否 | 是 | 否 | 学年,如2025-2026 |
| semester | tinyint | 1 | 否 | 是 | 否 | 学期:1-第一学期 2-第二学期 |
| start_date | date | - | 否 | 是 | 否 | 学期开始日期 |
| end_date | date | - | 否 | 是 | 否 | 学期结束日期 |
| is_current | tinyint | 1 | 否 | 是 | 否 | 是否当前学期:0-否 1-是 |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键,课程ID |
| course_code | varchar | 20 | 否 | 是 | 是 | 课程编号 |
| course_name | varchar | 100 | 否 | 是 | 否 | 课程名称 |
| credit | float | - | 否 | 是 | 否 | 课程学分 |
| hours | int | - | 否 | 是 | 否 | 总学时 |
| exam_type | tinyint | 1 | 否 | 是 | 否 | 考核方式:1-考试 2-考查 |
| dept_id | bigint | - | 否 | 是 | 否 | 开课院系ID |
| description | text | - | 否 | 否 | 否 | 课程描述 |
| syllabus | text | - | 否 | 否 | 否 | 课程大纲 |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键 |
| teacher_id | bigint | - | 否 | 是 | 否 | 教师用户ID,关联sys_user.id |
| course_id | bigint | - | 否 | 是 | 否 | 课程ID,关联edu_course.id |
| semester_id | bigint | - | 否 | 是 | 否 | 学期ID,关联sys_semester.id |
| class_id | bigint | - | 否 | 是 | 否 | 授课班级ID,关联sys_class.id |
| daily_score_ratio | int | - | 否 | 是 | 否 | 平时成绩占比(%),默认30 |
| mid_score_ratio | int | - | 否 | 是 | 否 | 期中成绩占比(%),默认20 |
| final_score_ratio | int | - | 否 | 是 | 否 | 期末成绩占比(%),默认50 |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 联合唯一索引 | teacher_id + course_id + semester_id + class_id |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键 |
| user_id | bigint | - | 否 | 是 | 是 | 关联用户ID,sys_user.id |
| student_no | varchar | 20 | 否 | 是 | 是 | 学号 |
| class_id | bigint | - | 否 | 是 | 否 | 所属班级ID,关联sys_class.id |
| major_id | bigint | - | 否 | 是 | 否 | 所属专业ID |
| dept_id | bigint | - | 否 | 是 | 否 | 所属院系ID |
| grade | int | - | 否 | 是 | 否 | 入学年份/年级 |
| gender | tinyint | 1 | 否 | 否 | 否 | 性别:1-男 2-女 |
| birth_date | date | - | 否 | 否 | 否 | 出生日期 |
| address | varchar | 255 | 否 | 否 | 否 | 联系地址 |
| emergency_contact | varchar | 20 | 否 | 否 | 否 | 紧急联系人 |
| emergency_phone | varchar | 11 | 否 | 否 | 否 | 紧急联系电话 |
| enrollment_date | date | - | 否 | 否 | 否 | 入学日期 |
| graduation_date | date | - | 否 | 否 | 否 | 毕业日期 |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键 |
| student_id | bigint | - | 否 | 是 | 否 | 学生ID,关联edu_student.id |
| teacher_course_id | bigint | - | 否 | 是 | 否 | 教师授课ID,关联edu_teacher_course.id |
| course_id | bigint | - | 否 | 是 | 否 | 课程ID |
| semester_id | bigint | - | 否 | 是 | 否 | 学期ID |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 联合唯一索引 | student_id + teacher_course_id |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键 |
| student_course_id | bigint | - | 否 | 是 | 是 | 学生选课ID,关联edu_student_course.id |
| student_id | bigint | - | 否 | 是 | 否 | 学生ID |
| course_id | bigint | - | 否 | 是 | 否 | 课程ID |
| semester_id | bigint | - | 否 | 是 | 否 | 学期ID |
| daily_score | float | - | 否 | 否 | 否 | 平时成绩 |
| mid_score | float | - | 否 | 否 | 否 | 期中成绩 |
| final_score | float | - | 否 | 否 | 否 | 期末成绩 |
| total_score | float | - | 否 | 否 | 否 | 总成绩(系统自动计算) |
| score_level | varchar | 10 | 否 | 否 | 否 | 成绩等级:优秀/良好/中等/及格/不及格 |
| rank_class | int | - | 否 | 否 | 否 | 班级排名 |
| rank_major | int | - | 否 | 否 | 否 | 专业排名 |
| status | tinyint | 1 | 否 | 是 | 否 | 成绩状态:0-未录入 1-已录入 2-已锁定 3-已发布 4-已申诉 |
| exam_status | tinyint | 1 | 否 | 是 | 否 | 考试状态:1-正常 2-缺考 3-缓考 4-作弊 |
| created_by | bigint | - | 否 | 是 | 否 | 创建人(教师ID) |
| updated_by | bigint | - | 否 | 否 | 否 | 最后修改人ID |
| created_at | datetime | - | 否 | 是 | 否 | 创建时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| is_deleted | tinyint | 1 | 否 | 是 | 否 | 逻辑删除 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键 |
| student_id | bigint | - | 否 | 是 | 否 | 申诉学生ID |
| score_id | bigint | - | 否 | 是 | 否 | 关联成绩ID,edu_student_score.id |
| course_id | bigint | - | 否 | 是 | 否 | 课程ID |
| appeal_reason | text | - | 否 | 是 | 否 | 申诉理由 |
| proof_file | varchar | 255 | 否 | 否 | 否 | 佐证材料附件地址 |
| status | tinyint | 1 | 否 | 是 | 否 | 申诉状态:0-待处理 1-已通过 2-已驳回 |
| handler_id | bigint | - | 否 | 否 | 否 | 处理人ID(教师/管理员) |
| handle_opinion | text | - | 否 | 否 | 否 | 处理意见 |
| handle_time | datetime | - | 否 | 否 | 否 | 处理时间 |
| created_at | datetime | - | 否 | 是 | 否 | 申请时间 |
| updated_at | datetime | - | 否 | 是 | 否 | 更新时间 |
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 唯一 | 字段说明 |
|---|---|---|---|---|---|---|
| id | bigint | - | 是 | 是 | 是 | 自增主键 |
| user_id | bigint | - | 否 | 否 | 否 | 操作用户ID |
| username | varchar | 50 | 否 | 否 | 否 | 操作用户名 |
| user_type | tinyint | 1 | 否 | 否 | 否 | 用户类型 |
| module | varchar | 50 | 否 | 是 | 否 | 操作模块 |
| operation | varchar | 50 | 否 | 是 | 否 | 操作类型 |
| ip | varchar | 50 | 否 | 否 | 否 | 操作IP |
| address | varchar | 100 | 否 | 否 | 否 | 操作地址 |
| request_method | varchar | 10 | 否 | 否 | 否 | 请求方式 |
| request_url | varchar | 255 | 否 | 否 | 否 | 请求地址 |
| request_param | text | - | 否 | 否 | 否 | 请求参数 |
| response_result | text | - | 否 | 否 | 否 | 响应结果 |
| status | tinyint | 1 | 否 | 是 | 否 | 操作状态:0-失败 1-成功 |
| error_msg | text | - | 否 | 否 | 否 | 错误信息 |
| operation_time | datetime | - | 否 | 是 | 否 | 操作时间 |
| cost_time | int | - | 否 | 是 | 否 | 耗时(毫秒) |
补充表:系统公告表、公告已读表、系统配置表,作为扩展表,保障功能完整性,设计规范与上述表一致。
| 交付类别 | 详细交付内容 |
|---|---|
| 项目源代码 | 前端完整源码、后端完整源码、数据库初始化脚本、Docker部署脚本、一键启动脚本 |
| 项目文档 | 需求规格说明书(本文档)、系统设计说明书、数据库设计说明书、用户操作手册、部署手册、测试报告、接口文档 |
| 毕业设计材料 | 毕业论文终稿、开题报告、中期检查报告、答辩PPT、系统演示视频、功能全量截图 |
| 可运行程序 | 系统打包安装包、Docker镜像、Windows/Linux一键部署包 |
| 测试类型 | 达标要求 |
|---|---|
| 单元测试 | 核心业务函数单元测试覆盖率≥80%,所有测试用例100%通过 |
| 功能测试 | 所有需求功能点100%实现,测试用例通过率100%,无阻塞性bug,一般bug≤2个 |
| 接口测试 | 所有API接口功能正常,参数校验完善,异常场景处理正确,接口文档与实际功能一致 |
| 性能测试 | 满足3.3.1节所有性能指标,100并发无异常,无数据丢失,响应时间达标 |
| 安全性测试 | 通过OWASP Top 10安全检测,无高危安全漏洞,权限控制无越权,数据加密符合规范 |
| 兼容性测试 | 主流浏览器运行正常,无样式错乱、功能异常,适配所有PC端主流分辨率 |
| 阶段 | 周期 | 核心工作内容 | 阶段交付物 |
|---|---|---|---|
| 需求与设计阶段 | 第1-2周 | 需求调研与确认、需求文档编写、系统架构设计、数据库设计、UI原型设计 | 需求规格说明书、系统设计文档、数据库设计文档、UI原型图 |
| 开发准备阶段 | 第3周 | 开发环境搭建、前后端项目脚手架搭建、Git仓库配置、数据库初始化、技术预研Demo开发 | 项目工程脚手架、数据库初始化脚本、开发环境配置文档 |
| 后端核心开发 | 第4-6周 | 数据库模型开发、认证与权限模块开发、核心业务接口开发、Redis缓存模块开发、异步任务开发、接口文档编写 | 后端完整接口、接口文档、单元测试用例 |
| 前端核心开发 | 第5-7周 | 前端项目搭建、公共组件开发、认证模块开发、管理员端页面开发、教师端页面开发、学生端页面开发、可视化模块开发 | 前端完整页面、交互功能实现、前端部署包 |
| 前后端联调 | 第8周 | 前后端接口联调、全业务流程打通、数据交互调试、bug修复、功能优化 | 可运行的完整系统、联调测试报告 |
| 测试与优化 | 第9周 | 全量功能测试、性能测试、安全性测试、兼容性测试、bug修复、系统性能优化、用户体验优化 | 测试报告、优化后的系统安装包 |
| 交付与答辩准备 | 第10周 | 毕业论文撰写与修改、所有项目文档完善、部署脚本编写、交付物整理、答辩PPT制作、演示视频录制 | 完整毕业设计交付物、毕业论文终稿、答辩PPT |
| 风险类型 | 风险描述 | 应对措施 |
|---|---|---|
| 技术风险 | 对Semi Design、Django DRF、Redis高级特性不熟悉,导致开发进度滞后 | 1. 开发前完成技术预研,编写核心功能Demo;2. 参考官方文档与最佳实践案例;3. 里程碑预留1周技术攻关缓冲时间;4. 采用成熟的开源解决方案,避免重复造轮子 |
| 进度风险 | 需求变更、开发难点导致项目进度延期 | 1. 开发阶段需求冻结,不接受大的需求变更;2. 小需求变更评估影响,调整里程碑计划;3. 拆分功能模块,迭代式开发,优先实现核心功能;4. 预留1周缓冲期,应对突发情况 |
| 安全风险 | 系统存在安全漏洞,导致越权操作、数据泄露 | 1. 开发阶段遵循安全开发规范,内置防注入、XSS防护;2. 采用成熟的认证与权限框架,杜绝越权漏洞;3. 上线前进行全面安全测试,修复所有高危漏洞;4. 敏感数据加密存储,全量操作留痕 |
| 性能风险 | 并发量高时系统响应慢,数据库压力大 | 1. 合理设计数据库索引,优化SQL查询;2. 全量落地Redis缓存方案,降低数据库压力;3. 分页查询、懒加载减少数据传输量;4. 基于Redis实现接口限流,防止恶意请求 |
| 部署风险 | 部署环境复杂,系统无法正常运行 | 1. 采用Docker容器化部署,统一环境配置,避免环境差异问题;2. 编写一键部署脚本,降低部署门槛;3. 提供详细的部署文档与常见问题排查指南;4. 开发环境与生产环境技术栈保持一致 |