springboot+vue3-学生信息管理系统

news2025/1/13 10:09:29

以下为学生信息管理的主要前端界面

项目仓库 CYHone/vue-student-ms: 学生信息管理系统前端界面 (github.com)

项目仓库 CYHone/student-ms-server: 学生信息管理系统后端代码 (github.com)

4.1、学生功能

登录界面可以以三种身份登录:学生、教师、管理员。

选择学生身份登录。

注册输入相关信息,输入邮箱,得到邮箱验证码。

主题后端代码

@RestController
//@CrossOrigin("*")
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private StudentService studentService;
    @Autowired
    private EmailService emailService;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    //@CrossOrigin(origins = "http://localhost:5173", allowCredentials = "true")
    @PostMapping("/registerCode")
    public Result sendRegisterCode(@RequestBody String encodedEmail){
        if (encodedEmail == null || encodedEmail.isEmpty()) {
            return Result.error("请输入邮箱!");
        }
        String email = URLDecoder.decode(encodedEmail, StandardCharsets.UTF_8);
        System.out.println("Decoded email: " + email);
        EmailDTO emailDTO = new EmailDTO();
        // 设置验证码
        String code = RandomUtil.getVerifyCode();
        System.out.println("验证码: " + code);
        String content = "验证码为 " + code + " ,五分钟有效,请妥善保管!";
        // 邮件内容
        emailDTO.setEmail(email);
        emailDTO.setTitle("学生信息管理系统——注册服务");
        emailDTO.setContent(content);
        // 查询用户
        Student student = studentService.findByEmail(email);
        if(student == null){
            //没被注册
            System.out.println("没被注册");
            System.out.println("准备向邮箱发送 " );
            try {
                emailService.sendMsg(emailDTO);
                // 往Redis中存储一个键值对
                ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
                operations.set(emailDTO.getEmail(), code, 300, TimeUnit.SECONDS);
                return Result.success();
            } catch (Exception e) {
                e.printStackTrace();
                return Result.error("邮件发送失败!");
            }
        }
        return Result.error("已被注册!");
    }
    @PostMapping("/register")
    public Result register(@RequestBody Student student) {
        System.out.println("正在验证学生注册:" + student);
        //还需要进行验证码判断
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
        student.setPassword((Md5Util.getMD5String(student.getPassword())));
        studentService.save(student);
        operations.getOperations().delete(student.getEmail());
        return Result.success("注册成功");
    }
    
    @PostMapping("/login")
    public ResponseEntity<Student> login(@RequestBody Student student) {
        System.out.println("正在验证学生登录:" + student);
        Student s = studentService.findByEmail(student.getEmail());
        System.out.println("查询到的学生:" + s);
        if (s == null || !Md5Util.checkPassword(student.getPassword(), s.getPassword())) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(null);
         } else {
            System.out.println(s.getName() + "成功登录");
            return ResponseEntity.ok(s);
        }
    }
    @PostMapping("updateStudent")
    public boolean updateStudent(@RequestBody Student student) {

        System.out.println("更新 " + student);
        student.setPassword((Md5Util.getMD5String(student.getPassword())));
        System.out.println("更新加密 " + student);
        return studentService.updateById(student);
    }
}

图4.5 学生登录界面

图4.6 学生主页界面

学生选课功能以及分页查询

选课信息查询: 学生能够查询自己已选课程的信息,包括课程名称、任课教师、上课时间和地点等。

课程成绩查询: 学生可以查询自己的课程成绩,系统提供成绩的详细查询和报表下载功能,方便学生了解自己的学业情况和学习进度。

图4.7 学生选课界面

图4.8 学生退课界面

@RestController
@RequestMapping("/student")
public class CourseController {
    private final CourseService courseService;

    @Autowired
    public CourseController(CourseService courseService) {
        this.courseService = courseService;
    }

    @PostMapping("/courses")
    public Map<String, Object> getAllCourses(@RequestBody Map<String, Integer> paginationParams) {
        int offset = paginationParams.getOrDefault("offset", 0);
        int limit = paginationParams.getOrDefault("limit", 10); // 默认每页显示 10 条数据
        List<CourseDTO> courses = courseService.getAllCourses(offset, limit);
        int totalCount = courseService.getTotalCount(); // 获取总记录数
        Map<String, Object> result = new HashMap<>();
        result.put("courses", courses);
        result.put("totalCount", totalCount);
        return result;
    }

    @PostMapping("/searchCourse")
    public Map<String, Object> getCourses(@RequestBody Map<String, Object> requestData) {
        int offset = (int) requestData.getOrDefault("offset", 0);
        int limit = (int) requestData.getOrDefault("limit", 10);
        String keyword = (String) requestData.getOrDefault("keyword", "");
        String type = (String) requestData.getOrDefault("type", "courseName");

        List<CourseDTO> courses = courseService.getCourses(offset, limit, keyword, type);
        int totalCount = courseService.getCoursesCount(keyword, type);

        Map<String, Object> result = new HashMap<>();
        result.put("courses", courses);
        result.put("totalCount", totalCount);
        return result;
    }

    @PostMapping("/selectCourse")
    public boolean selectCourse(@RequestBody SelectCourseRequest request) {
        Integer courseID = request.getCourseID();
        System.out.println("课程号"+courseID);
        Integer studentID = request.getStudentID();
        System.out.println("学号"+studentID);
        return courseService.selectCourse(courseID, studentID);
    }

    @PostMapping("/myCourses")
    public List<CourseDTO> getAllMyCourses(@RequestBody Integer studentId) {
        System.out.println("学号" + studentId);
        return courseService.getAllMyCourses(studentId);
    }
    @PostMapping("/deleteCourses")
    public boolean deleteCourse(@RequestBody Integer  deleteCourseId ){
        System.out.println("删除课程ID" + deleteCourseId);
        return courseService.deleteCourse(deleteCourseId);
    }
    @PostMapping("/grade")
    public List<GradeDTO> getGrade(@RequestBody Integer studentId){
        System.out.println("学号" + studentId);
        return courseService.getGrade(studentId);
    }

}

 图4.9分数统计图界面

图4.10 修改个人信息

4.2、教师功能

图4.12 教师课程管理

图4.13 教师开设课程管理

图4.16 教师查询学生成绩

4.3 管理员功能

图4.17 管理员修改老师密码

图4.17 管理员查询老师档案

图4.17 管理员排课功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1819806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jsp 实验20

三、源代码以及执行结果截图&#xff1a; NewFile.jsp <% page import "java.io.*" %> <% page contentType"text/html" %> <% page pageEncoding "utf-8" %> <jsp:useBean id"english" class "web.Engli…

oracle 删除当前用户下所有表

荆轲刺秦王 通常呢 我们将正式环境的 oracle 数据库 导出成 dmp 文件&#xff0c;然后导入到测试环境或者本地环境&#xff0c;期间可能会出现各种问题。那么如何使错误的导入数据全部删除呢。可以这样做&#xff1a; 1. 本地虚拟机启动 oracle 服务 2. sqldeveloper 连接 o…

多商户小程序开发步骤和方法

在当今的数字经济中&#xff0c;多商户小程序作为一种创新的商业平台&#xff0c;提供了一种新的商业模式&#xff0c;使多个商户能够在同一平台上展示和销售他们的产品或服务。这种模式不仅增强了消费者选择的多样性&#xff0c;也为商家提供了一个更广泛的销售渠道。以下是详…

探索Java 8 Stream API:现代数据处理的新纪元

Stream流 Stream初探&#xff1a;何方神圣&#xff1f; Stream流是一种处理集合数据的高效工具&#xff0c;它可以让你以声明性的方式处理数据集合。Stream不是存储数据的数据结构&#xff0c;而是对数据源&#xff08;如集合、数组&#xff09;的运算操作概念&#xff0c;支…

微信小程序开发教程

尚硅谷微信小程序开发教程&#xff0c;2024最新版微信小程序项目实战&#xff01; 一、小程序基础 1. 初始小程序 微信小程序是一种运行在微信内部的 轻量级 应用程序。 使用小程序时 不需要下载&#xff0c;用户 扫一扫 或 搜一下 即可打开应用&#xff0c;它也体现了 “用…

基于Django和Vue的商城管理系统

文章目录 前言一、系统运行结果二、相关技术简介三、系统设计四、系统测试五、总结 前言 近年来&#xff0c;互联网技术的飞速发展极大地改变了人们的生活方式。网络购物作为一种新的购物模式&#xff0c;因其方便、快捷、选择多样等优点&#xff0c;迅速普及。为了满足人们日…

Python第二语言(十二、SQL入门和实战)

目录 1. Python中使用MySQL 1.1 pymysql第三方库使用MySQL 1.2 连接MySQL 1.3 操作数据库&#xff0c;创建表 1.4 执行查询数据库语句 2. python中MySQL的插入语句 2.1 commit提交 2.2 自动提交 3. pymysql案例 3.1 数据内容 3.2 DDL定义 3.3 实现步骤 3.4 文件操…

UITableView之cell复用

关于cell复用的必要性 cellForRowAtIndexPath会随着屏幕滚动而调用&#xff0c;每次出现新行时因为行号变化&#xff0c;就会被调用。 底层原理&#xff1a;当前单元格滚出屏幕时cell销毁&#xff0c;当前单元格又滚回来时cell创建。短时间内频繁创建和销毁cell会影响系统性能…

vue2文件下载和合计表格

vue2文件数据不多可以直接下载不需要后端的时候 1.首先&#xff0c;确保你已经安装了 docx 和 file-saver 库 npm install file-saver npm install docx file-saver2.全部代码如下 <template><a-modaltitle"详情"width"80%"v-model"visi…

舵机堵转的危害与简单解决方式

舵机的堵转保护是一种安全特性&#xff0c;用于防止舵机在遇到阻力无法正常旋转时受到损害。当舵机尝试移动到某个位置但因为外部阻力&#xff08;如卡住或碰撞&#xff09;而无法完成动作时&#xff0c;它会持续施加力直至达到其最大扭矩。如果没有堵转保护&#xff0c;这种情…

OpenCV学习(4.14) 基于分水岭算法的图像分割

1. 目标 在这一章当中&#xff0c; 我们将学习使用分水岭算法使用基于标记的图像分割我们将看到&#xff1a;cv.watershed() 2.理论 任何灰度图像都可以看作是地形表面&#xff0c;其中高强度表示峰和丘陵&#xff0c;而低强度表示山谷。您开始用不同颜色的水&#xff08;标…

什么是基于风险的漏洞管理RBVM,及其优势

文章目录 一、什么是漏洞管理二、什么是基于风险的漏洞管理RBVM三、RBVM的基本流程四、RBVM的特点和优势 一、什么是漏洞管理 安全漏洞是网络或网络资产的结构、功能或实现中的任何缺陷或弱点&#xff0c;黑客可以利用这些缺陷或弱点发起网络攻击&#xff0c;获得对系统或数据…

Vue前端ffmpeg压缩视频再上传(全网唯一公开真正实现)

1.Vue项目中安装插件ffmpeg 1.1 插件版本依赖配置 两个插件的版本 "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1"package.json 和 package-lock.json 都加入如下ffmpeg的版本配置&#xff1a; 1.2 把ffmpeg安装到项目依…

飞腾派初体验(2)

水个字数&#xff0c;混个推广分&#xff0c;另外几个点还是想吐槽一下 - 1&#xff0c;上篇文章居然没有给开发板一个硬照&#xff0c;补上 - 飞腾派 自拍 2. 现在做镜像用Win32DiskImager的多吗&#xff1f;我记得当年都是dd命令搞定&#xff0c;玩树莓派的应该记得这个命令…

离散化——Acwing.802区间和

离散化 定义 离散化可以简单理解为将连续的数值或数据转换为离散的、有限个不同的值或类别。离散化就是将一个可能具有无限多个取值或在一个较大范围内连续取值的变量&#xff0c;通过某种规则或方法&#xff0c;划分成若干个离散的区间或类别&#xff0c;并将原始数据映射到…

【课程总结】Day8(下):计算机视觉基础入门

前言 数据结构 在人工智能领域&#xff0c;机器可以处理的数据类型如上图&#xff0c;大约可以分为以上类别。其中较为常用的数据类别有&#xff1a; 表格类数据 数据特点&#xff1a; 成行成列&#xff1a;一行一个样本&#xff0c;一列一个特征特征之间相互独立&#xff0…

最实用的AI软件开发工具CodeFlying测评

就在上个月&#xff0c;OpenAI宣布GPT-4o支持免费试用&#xff0c;调用API价格降到5美元/百万token。 谷歌在得到消息后立马将Gemini 1.5 的价格下降到0.35美元/百万token。 Anthropic的API价格&#xff0c;直接干到了0.25美元/百万token。 国外尚且如此&#xff0c;那么国内…

科技赋能,避震婴儿车或成为行业硬通货

全球知识经济发展发展到今天&#xff0c;消费者对于品质、服务、体验的要求越来越高&#xff0c;与之对应的产品也就越来越科技化、智能化、个性化&#xff0c;品牌化和差异化逐步成为产品的竞争核心。 婴儿推车作为关系婴幼儿出行安全的支柱性产业之一&#xff0c;从车架结构…

分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了

前言 实际上&#xff0c;.NET Core 内部也内置了一套日志系统&#xff0c;它是一个轻量级的日志框架&#xff0c;用于记录应用程序的日志信息。 它提供了 ILogger 接口和 ILoggerProvider 接口&#xff0c;以及一组内置的日志提供程序&#xff08;如 Console、Debug、EventSo…

STM32-17-DAC

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD STM32-15-DMA…