学生管理系统(超详细教程+源码)

学生管理系统

1. 前言

1.1 项目地址

本项目共有前后两端地址(使用Docker部署,也可以自己部署到本地)。

2. 开发环境

2.1 基础环境

  • JDK版本: 17
  • MySQL版本: 8.0.36
  • Redis版本: 3.2.100
  • IntelliJ IDEA版本: 2024.1
  • Node版本: 20.10.0
  • Docker版本: 26.1.0
  • Nginx版本: 1.18.0

2.2 技术栈

  • 前端: vue-admin-template模板(vue、element-ui)、ECharts、Vuex Store
  • 后端: Springboot、mybatis-plus、maven、阿里云oss对象存储、MD5加密、JWT、邮箱服务、Servlet

3. 系统分析

3.1 需求分析

用户角色与权限

系统应支持三种用户角色:管理员、教师和学生。每种角色都有其特定的功能需求。

  • 管理员: 用户管理、课程管理等。
  • 教师: 个人信息修改、任课信息查询、学生课程成绩管理等。
  • 学生: 个人信息修改、选课信息查询、课程成绩查询等。
3.1.1 公共功能
  • 注册与登录: 提供注册和登录功能,确保用户能够正确地进入系统并使用其账户。
  • 初步验证: 在注册过程中使用JavaScript进行密码格式、手机号、邮箱等的初步验证。
  • 验证码功能: 登录时增加验证码功能,增强账户安全性。
  • 找回密码: 通过邮箱进行找回密码操作。
  • 上传图片: 允许用户上传图片用于个人资料的更新。
  • 报表统计与查询检索: 生成各种报表,并提供强大的查询检索功能。
3.1.2 管理员用户功能
  • 用户管理: 修改各用户的密码,进行用户管理操作。
  • 教师档案管理: 管理教师档案,包括基本信息、工作经历、学历学位等。
  • 学生档案管理: 管理学生档案,包括基本信息、成绩、选课情况等。
  • 课程管理: 负责课程的排课,包括确定任课教师、时间和教室等。
3.1.3 教师用户功能
  • 个人信息修改: 修改个人信息,包括上传头像等。
  • 任课信息查询: 查询任课信息。
  • 学生课程成绩管理: 管理学生的课程成绩,可以以图形化显示或报表形式下载。
  • 学生课程信息分类查询: 根据成绩对学生课程信息进行分类查询,并提供下载和图形化显示选项。
3.1.4 学生用户功能
  • 个人信息修改: 修改个人信息,如姓名、学号、性别等,并上传头像。
  • 选课信息查询: 查询选课信息,包括任课教师、上课时间和地点。
  • 课程成绩查询: 查询课程成绩,并以报表形式下载。

3.3 系统流程分析

系统分为管理员、教师、学生三个角色。每个角色代表不同的账号身份和功能需求。

  • 用户登录流程: 账号和密码必须与数据库中的信息比对,只有正确的信息才能进入下一步操作。

3.4 系统性能分析

  • 后端数据库: 采用MySQL与Redis缓存结合使用,减少数据库访问次数和查询开销。合理设计数据库表结构,建立索引,加快查询速度,使用数据库连接池管理数据库连接。
  • 后端算法优化: 优化算法和代码逻辑,减少资源消耗和计算时间。
  • 前端Vue: 添加keep-alive功能,提升系统性能和用户体验,减少页面渲染开销。

4. 系统设计

4.1 功能结构设计

系统主要基于数据的增加、修改、删除等操作。

4.1.1 管理员功能结构设计

管理员功能包括找回密码(邮箱),上传头像和数据报表统计,对教师和学生的档案管理以及密码管理,对课程信息进行管理。

4.1.2 教师功能结构设计

教师功能包括找回密码(邮箱),上传头像和数据报表统计,对课程进行选择任教,任课信息查询,学生成绩管理及图形化展示,学生课程成绩分类查询。

4.1.3 学生功能结构设计

学生功能包括找回密码(邮箱),上传头像和数据报表统计,对个人信息修改,选课信息查询,课程成绩查询以及报表下载。

4.2 数据库设计

数据库设计包括以下几个关键表:course(课程表)、teacher(教师表)、student(学生表)以及关联表courseteacher(课程-教师关联表)和studentcourseteacher(学生-课程-教师关联表)。

4.2.1 course(课程表)表格设计
列名数据类型说明
cidint课程ID(主键)
cnamevarchar(30)课程名称
ccredittinyint课程学分
locationvarchar(100)上课地点
schedulevarchar(100)上课时间表

索引:cid和cname,Fields分别为cid和cname。

4.2.2 teacher(教师表)表格设计
列名数据类型说明
tidint教师ID(主键)
tnamevarchar(30)教师姓名
passwordvarchar(255)密码(加密存储)
avatarvarchar(255)头像图片链接
emailvarchar(255)电子邮箱
phonevarchar(20)手机号码

索引:tid和tname,Fields分别为tid和tname。

4.2.3 student(学生表)表格设计
列名数据类型说明
sidint学生ID(主键)
snamevarchar(30)学生姓名
passwordvarchar(255)密码(加密存储)
avatarvarchar(255)头像图片链接
emailvarchar(255)电子邮箱
phonevarchar(20)手机号码

索引:sid和sname,Fields分别为sid和sname。

4.2.4 courseteacher(课程-教师关联表)表格设计
列名数据类型说明
ctidint关联ID(主键)
cidint课程ID(外键,关联course)
tidint教师ID(外键,关联teacher)
termvarchar(30)学期
locationvarchar(100)上课地点
schedulevarchar(100)上课时间表

索引:ctid、cid和tid,Fields分别为ctid、cid和tid。

4.2.5 studentcourseteacher(学生-课程-教师关联表)表格设计
列名数据类型说明
sctidint关联ID(主键)
sidint学生ID(外键,关联student)
cidint课程ID(外键,关联course)
tidint教师ID(外键,关联teacher)
gradefloat成绩
termvarchar(30)学期

索引:sid、cid和tid,Fields分别为sid、cid和tid。

  • 数据库中的主键和外键都有明确的命名规则,以便于理解和维护。
  • 密码采用了加密存储,以增强安全性。
  • 学生-课程-教师关联表中包含了成绩信息,以便于记录学生在每门课程中的表现。

5 系统实现

5.1 管理员功能实现

5.1.1 教师信息管理

管理员进入如图 5.1 所示的教师信息管理界面之后,管理员点击信息显示栏中的教师列表,可以对教师信息进行修改、删除和编辑操作。同时也可以输入教师工号或者姓名进行查询,并且可以开启或者关闭模糊查询。学生信息管理功能同上。

在这里插入图片描述

Web层

/**
 * 根据条件查询教师信息
 * @param map 查询条件,包含教师姓名和模糊查询标志
 * @return 符合条件的教师列表
 */
@PostMapping("/findBySearch")
@ApiOperation("根据条件查询教师信息")
public List<Teacher> findBySearch(@RequestBody Map<String, String> map) {
    return teacherService.findBySearch(map);
}

Service层

/**
 * 根据条件查询教师信息
 * @param map 查询条件,包含教师ID、姓名和模糊查询标志
 * @return 符合条件的教师列表
 */
@ApiOperation("根据条件查询教师信息")
public List<Teacher> findBySearch(Map<String, String> map) {
    Integer tid = null;
    String tname = null;
    Integer fuzzy = null;
    if (map.containsKey("tid")) {
        try {
            tid = Integer.parseInt(map.get("tid"));
        } catch (Exception e) {
            // handle exception
        }
    }
    if (map.containsKey("tname")) {
        tname = map.get("tname");
    }
    if (map.containsKey("fuzzy")) {
        fuzzy = map.get("fuzzy").equals("true") ? 1 : 0;
    }
    return teacherMapper.findBySearch(tid, tname, fuzzy);
}
5.1.2 课程信息管理

管理员进入如图 5.2 所示的课程信息管理界面之后,管理员点击信息显示栏中的编辑课程,可以对课程信息进行修改、删除和编辑操作。

在这里插入图片描述

Web层

/**
 * 更新现有课程
 *
 * @param course 更新后的课程对象
 * @return 如果课程成功更新,则为true,否则为false
 */
@ApiOperation("更新课程")
@PostMapping("/updateCourse")
public boolean updateCourse(@RequestBody Course course) {
    return courseService.updateById(course);
}
5.1.3 学生成绩管理

管理员进入如图 5.3 所示的学生成绩信息管理界面之后,管理员点击信息显示栏中的学生成绩查询,可以对学生成绩进行修改、删除和编辑操作,也可以进行多样查询,模糊查询等操作。

在这里插入图片描述

Mapper层

/**
 * 根据提供的条件搜索SCT信息。
 * @param sid 学生ID,可选参数。
 * @param sname 学生姓名,可选参数。
 * @param sFuzzy 是否进行学生姓名的模糊搜索,可选参数。
 * @param cid 课程ID,可选参数。
 * @param cname 课程名称,可选参数。
 * @param cFuzzy 是否进行课程名称的模糊搜索,可选参数。
 * @param tid 教师ID,可选参数。
 * @param tname 教师姓名,可选参数。
 * @param tFuzzy 是否进行教师姓名的模糊搜索,可选参数。
 * @param lowBound 成绩下限,可选参数。
 * @param highBound 成绩上限,可选参数。
 * @param term 学期,可选参数。
 * @param classification 分类,可选参数。
 * @return 返回匹配搜索条件的SCT信息列表。
 */
public List<SCTInfo> findBySearch1(@Param("sid") Integer sid,
                                   @Param("sname") String sname,
                                   @Param("sFuzzy") Integer sFuzzy,
                                   @Param("cid") Integer cid,
                                   @Param("cname") String cname,
                                   @Param("cFuzzy") Integer cFuzzy,
                                   @Param("tid") Integer tid,
                                   @Param("tname") String tname,
                                   @Param("tFuzzy") Integer tFuzzy,
                                   @Param("lowBound") Integer lowBound,
                                   @Param("highBound") Integer highBound,
                                   @Param("term") String term,
                                   @Param("classification") String classification); // 添加分类参数
5.1.4 学生成绩报表导出

管理员进入如图 5.4 所示的学生成绩信息管理界面之后,管理员点击信息显示栏中的数据统计,可以对学生课程成绩进行可视化统计和查看,也可以将统计的数据进行导出报表,如图 5.5。

在这里插入图片描述

在这里插入图片描述

Service层

/**
 * 导出课程业务数据为Excel表格。
 *
 * @param cname 课程名称
 * @param term 学期
 * @param response HttpServlet响应,用于向客户端提供下载
 */
public void exportBusinessData(String cname, String term, HttpServletResponse response) {
    CourseStatisticVO courseStatisticVO = this.findByCname(cname, term);
    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("templates/课程成绩报表.xlsx");
    try {
        XSSFWorkbook excel = new XSSFWorkbook(inputStream);
        //获得Excel文件中的一个Sheet页
        XSSFSheet sheet = excel.getSheet("Sheet1");
        //获得第1行
        XSSFRow row = sheet.getRow(0);
        //根据row将第一行第二列写入cname数据
        row.getCell(1).setCellValue(cname + "-成绩报表" +"(" + term + ")");
        //此处省略后面n行的写入,方法同上
        //写入当前日期,精确到分秒
        row.getCell(1).setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);
        out.flush();
        out.close();
        excel.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

5.2 教师功能实现

5.2.1 教师上传头像

教师进入如图 5.6 所示的教师编辑界面之后,教师点击信息显示栏中的上传头像,可以对本地的头像进行上传,头像加载为阿里云的OSS对象,文件名生成采用的是UUID工具类的randomUUID,使得文件名唯一性。

在这里插入图片描述

Web层

/**
 * 文件上传
 * @param file
 * @return
 */
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> upload(MultipartFile file){
    log.info("文件上传:{}",file);
    try {
        //原始文件名
        String originalFilename = file.getOriginalFilename();
        //截取原始文件名的后缀   dfdfdf.png
        String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
        //构造新文件名称
        String objectName = UUID.randomUUID().toString() + extension;
        //文件的请求路径
        String filePath = aliOssUtil.upload(file.getBytes(), objectName);
        log.info("文件上传成功,文件路径为:{}", filePath);
        return Result.success(filePath);
    } catch (IOException e) {
        log.error("文件上传失败:{}", e);
    }
    return Result.error(MessageConstant.UPLOAD_FAILED);
}
5.2.2 开设课程

教师进入如图 5.7 所示的课程设置界面之后,教师点击信息显示栏中的开设课程,可以对所有展示的课程信息进行选择开设,并且可以对课程信息进行多重查询。

在这里插入图片描述

Web层

/**
 * 根据条件查询课程教师信息
 * @param map 查询条件
 * @return 符合条件的课程教师信息列表
 */
@PostMapping("/findCourseTeacherInfo")
@ApiOperation(value = "根据条件查询课程教师信息")
public List<CourseTeacherInfo> findCourseTeacherInfo(@RequestBody Map<String, String> map) {
    return courseTeacherService.findCourseTeacherInfo(map);
}
5.2.3 学生成绩管理

教师进入如图 5.8 所示的学生成绩管理界面之后,教师点击信息显示栏中的成绩管理,可以对所有展示的学生成绩进行编辑,并且可以对成绩信息进行多重查询。

在这里插入图片描述

Web层

/**
 * 根据提供的条件查询选课信息。
 *
 * @param map 包含查询条件的键值对参数,键代表查询字段,值代表查询值。
 * @return 返回一个包含查询结果的SCTInfo列表。


 */
@PostMapping("/findBySearch1")
@ApiOperation("根据条件查询SCT信息")
public List<SCTInfo> findBySearch1(@RequestBody Map<String, String> map) {
    return sctInfoService.findBySearch1(map);
}

5.3 学生功能实现

5.3.1 课程选课管理

学生进入如图 5.9 所示的学生选课界面之后,学生点击信息显示栏中的选课管理,可以对展示的课程信息进行多重条件查询和添加选课操作,修改已经选择的课程。

在这里插入图片描述

Web层

/**
 * 处理选课操作
 * @param sct 选课对象,包含学生ID和课程ID
 * @return 成功则返回1,失败则返回0
 */
@ApiOperation("选课")
@PostMapping("/addSCT")
public int addSCT(@RequestBody SCT sct) {
    return sctService.addSCT(sct);
}
5.3.2 课程成绩查询

学生进入如图 5.10 所示的课程成绩查询界面之后,学生点击信息显示栏中的课程成绩查询,可以对展示的课程成绩信息进行查询和统计。

在这里插入图片描述

Mapper层

/**
 * 根据学生ID和学期查询学生成绩信息。
 * @param sid 学生ID
 * @param term 学期
 * @return 学生成绩信息列表
 */
public List<SCTInfo> findBySid(@Param("sid") Integer sid, @Param("term") String term);

6 系统测试

6.1 测试环境

本次测试的系统环境如下:

  • 硬件环境:
    • 处理器:Intel Core i7
    • 内存:16 GB
    • 硬盘:500 GB SSD
  • 软件环境:
    • 操作系统:Windows 10
    • 数据库:MySQL 8.0
    • 开发平台:IDEA 2021.1
    • Web服务器:Apache Tomcat 9.0
    • 浏览器:Google Chrome

6.2 测试方法

  • 单元测试:对系统中的各个模块进行独立测试,确保各个模块的功能符合设计要求。
  • 集成测试:将各个模块集成在一起进行测试,验证模块之间的接口和交互。
  • 系统测试:在模拟真实环境下,对整个系统进行全面测试,验证系统的功能、性能、可靠性等是否符合预期。

6.3 测试用例

测试编号测试名称测试输入预期输出实际输出结果
TC001教师信息查询教师姓名、模糊查询标志匹配的教师列表匹配的教师列表通过
TC002课程信息更新课程对象更新成功或失败更新成功通过
TC003学生成绩查询学生姓名、课程名称、模糊查询标志等匹配的学生成绩列表匹配的学生成绩列表通过
TC004教师头像上传头像文件文件上传路径文件上传路径通过
TC005课程开设课程信息课程开设成功或失败课程开设成功通过
TC006成绩管理学生成绩信息成绩更新成功或失败成绩更新成功通过
TC007学生选课管理课程信息选课成功或失败选课成功通过
TC008学生成绩查询学生ID、学期学生成绩信息列表学生成绩信息列表通过

6.4 测试结果

经过单元测试、集成测试和系统测试,本系统所有功能模块均能正常运行,满足设计要求。测试结果如下:

  • 功能测试:所有功能均能正确实现,操作界面友好,用户体验良好。
  • 性能测试:在大数据量和高并发条件下,系统运行稳定,响应时间满足要求。
  • 可靠性测试:系统在长时间运行过程中无异常,数据处理准确无误。

6.5 存在的问题及解决方案

在测试过程中,发现了以下问题,并已提出解决方案:

  1. 问题描述:教师信息模糊查询时,查询结果不准确。
    解决方案:调整模糊查询算法,优化查询条件,提高查询准确性。

  2. 问题描述:课程信息更新时,某些字段未能正确保存。
    解决方案:检查更新逻辑,确保所有字段正确传递并保存到数据库。

  3. 问题描述:学生选课管理功能中,部分选课操作未能成功。
    解决方案:检查选课逻辑,确保选课操作的事务处理正确,避免数据不一致。

  4. 问题描述:系统在高并发访问时,响应时间较长。
    解决方案:优化数据库查询,提高系统处理效率,增加服务器硬件配置。

最后再补充一句,上述环境开发完毕之后,如果想学习服务部署Docker的话,可以看这篇(●ˇ∀ˇ●)!

点击这里:Docker部署项目

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue毕设学生宿舍管理系统源码的运行教程如下: 1. 确保已经安装了Node.js和Vue CLI。可以从官方网站上下载和安装最新版的Node.js,并使用npm(Node.js包管理器)安装Vue CLI。 2. 下载源码。可以从GitHub上下载Vue毕设学生宿舍管理系统的源码,例如从https://github.com/your-repository 下载。 3. 解压源码文件,并打开终端(或命令提示符),进入源码所在的目录。 4. 安装依赖。在终端(或命令提示符)中运行命令`npm install`,它将自动根据`package.json`文件中的依赖项列表安装所需的所有依赖项。 5. 修改配置。根据你的需要,修改`src/config.js`文件中的数据库配置、服务器地址等相关参数。 6. 启动开发服务器。在终端(或命令提示符)中运行命令`npm run serve`,它将启动开发服务器并监听你指定的端口(默认为8080)。你可以在浏览器中打开`http://localhost:8080`来访问系统。 7. 构建生产版本。如果你想构建生产版本以供部署使用,可以在终端(或命令提示符)中运行命令`npm run build`。它将生成一个用于生产环境的优化和压缩后的代码文件,你可以将其部署到任何支持静态文件的Web服务器上。 总结:通过以上步骤,你就可以成功运行Vue毕设学生宿舍管理系统的源码了。如果在配置或运行过程中遇到任何问题,可以参考Vue的官方文档或向社区寻求帮助。祝你顺利完成毕设!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值