基于java的研究生奖学金管理系统(Spring Boot+Vue +Mysql+Tomcat+MyBatis)附下载链接

基于SpringBoot+VUE的研究生奖学金管理系统

点我下载此资源》》》》》》》》》》》》》》》》》》》》》》》

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

摘 要

随着高等教育信息化的不断推进,传统的人工奖学金管理方式已无法满足现代高校对奖学金评定工作的效率和质量要求。本文设计并实现了一个基于Spring Boot和Vue.js的研究生奖学金管理系统,旨在提高奖学金申请、审核和管理的自动化水平。
系统采用前后端分离架构,后端基于Spring Boot框架构建RESTful API接口,使用MyBatis进行数据持久化,MySQL作为关系型数据库存储学生信息、课程成绩、科研成果等数据。前端采用Vue 3框架结合Element Plus组件库构建用户界面,通过Axios实现与后端的数据交互。系统实现了学生信息管理、课程成绩录入、科研成果记录、社会服务统计、奖学金申请提交、导师审核评定等核心功能模块。
经过系统测试,该管理系统能够有效处理研究生奖学金申请的全流程业务,支持多角色用户权限管理,实现了奖学金评定的自动化计算和排名。系统具有良好的用户界面和操作体验,显著提高了奖学金管理工作的效率,减少了人工操作错误,为高校奖学金管理工作提供了可靠的信息化解决方案。

关键词:Spring Boot,Mysql,VUE,研究生奖学金管理系统

Abstract
With the advancement of higher education informatization, traditional manual scholarship management methods can no longer meet the efficiency and quality requirements of modern universities. This paper designs and implements a graduate scholarship management system based on Spring Boot and Vue.js, aiming to automate the processes of application, review, and administration.
The system adopts a frontend-backend separation architecture:
Backend: Built with Spring Boot to provide RESTful APIs, using MyBatis for data persistence and MySQL to store student information, course grades, research achievements, and other critical data.
Frontend: Developed with Vue 3 and Element Plus for an intuitive user interface, with Axios handling API interactions.
Core functionalities include:
Student information management
Course grade input and research achievement tracking
Social service statistics
Scholarship application submission and advisor review
System testing demonstrates that the solution effectively supports end-to-end scholarship workflows, multi-role permission control, and automated score calculation/ranking. With a user-friendly interface, it significantly improves efficiency and reduces manual errors, offering universities a reliable digital management tool.

Key Words:SpringBoot;Vue.js; Mysql;Scholarship Management System

目 录
摘 要 I
Abstract II

  1. 引言 1
    1.1 系统背景 1
    1.2 系统开发的意义 1

  2. 相关技术研究 1
    2.1 Spring Boot 1
    2.2 Vue.js 1
    2.3 MyBatis 1

  3. 需求分析 1

  4. 总体设计 1
    4.1 架构设计 1
    4.2 功能模块设计 2
    4.3数据库设计 2

  5. 系统实现 3
    5.1 登录界面 3
    5.2学生申请奖学金界面 3
    5.3 导师管理界面 3

  6. 总结与展望 3
    参 考 文 献 4

  7. 引言
    1.1 系统背景
    随着高等教育信息化的不断推进,传统的人工奖学金管理方式已无法满足现代高校对奖学金评定工作的效率和质量要求。本文设计并实现了一个基于Spring Boot和Vue.js的研究生奖学金管理系统,旨在提高奖学金申请、审核和管理的自动化水平。
    1.2 系统开发的意义

  8. 提高效率
    自动化处理申请流程,减少手工操作
    快速计算成绩排名,避免人工错误
    学生和导师操作更便捷

  9. 保证公平
    统一评分标准,减少主观因素
    透明化操作,可追溯审核过程
    标准化流程,确保评定公正

  10. 优化管理
    集中管理所有数据,便于维护
    实时更新状态,信息及时准确
    减少人力成本,提高资源利用率

  11. 推动信息化
    符合教育现代化发展趋势
    为学校积累信息化建设经验
    支持管理创新和服务升级
    总结: 这个系统解决了传统奖学金管理效率低、易出错、不透明的问题,提高了管理质量,推动了高校信息化建设。

  12. 相关技术研究
    2.1 Spring Boot框架
    Spring Boot是基于Spring框架的快速开发平台,采用"约定优于配置"的设计理念,旨在简化Spring应用的初始搭建和开发过程。基本概念:Spring Boot是一个开源的Java框架,它通过自动配置、起步依赖、Actuator监控等功能,让开发者能够快速创建独立运行、生产级别的Spring应用程序。特点:
    自动配置:根据项目依赖自动配置Spring应用,减少手动配置工作
    起步依赖:提供预配置的依赖组合,简化Maven/Gradle配置
    内嵌服务器:内置Tomcat、Jetty等服务器,无需部署WAR文件
    生产就绪:提供健康检查、指标监控、外部化配置等生产环境功能
    无代码生成:无需XML配置,通过注解和Java配置即可完成
    优势:
    开发效率高:减少样板代码,快速搭建项目结构
    学习成本低:简化配置,降低Spring框架的学习门槛
    微服务友好:支持快速构建微服务应用
    生态丰富:与Spring生态完美集成,支持各种扩展
    部署简单:可打包成JAR文件直接运行,简化部署流程
    在本系统中,Spring Boot作为后端框架,提供了RESTful API接口、数据库访问、事务管理、安全认证等核心功能,为前端提供稳定可靠的数据服务
    2.2 Vue.js
    Vue.js是一套渐进式JavaScript框架,专注于构建用户界面,采用MVVM模式实现数据驱动视图。
    核心特性:
    响应式数据绑定:通过v-model实现表单与数据的双向同步。
    组件化开发:将UI拆分为可复用的组件(如申请表单、成绩表格)。
    虚拟DOM:优化渲染性能,减少直接DOM操作。
    Vue Router:支持前端路由跳转(如学生/导师端页面切换)。
    系统中的应用:
    使用Vue 3组合式API开发动态前端页面(如奖学金申请表单、成绩统计图表)。
    集成Element Plus组件库快速构建表格、弹窗等交互元素。
    通过Axios与Spring Boot后端异步交互,实现无刷新数据加载。
    2.3 MyBatis
    技术概述
    MyBatis是一款半自动化的ORM框架,通过XML或注解将Java对象与SQL语句映射,避免手动处理JDBC冗余代码。
    核心特性
    动态SQL:支持、等标签灵活拼接SQL。
    缓存机制:一级缓存(Session级)和二级缓存(全局)提升查询效率。
    结果集映射:自动将ResultSet转换为Java对象或集合。
    系统中的应用
    管理MySQL中的学生成绩、科研成果等结构化数据。
    通过@Select/@Update注解实现奖学金审核状态的CRUD操作。
    结合PageHelper插件实现申请记录的分页查询。

3.需求分析
3.1 核心功能模块
3.1.1 用户认证与权限管理
用户登录:支持学生和导师两种角色登录,通过学号/工号和密码进行身份验证
身份验证:基于JWT Token的身份验证机制,确保系统安全性
权限控制:不同角色用户访问不同的功能模块和页面
3.1.2 学生端功能模块
奖学金申请管理
奖学金浏览:查看可申请的奖学金类型、金额、评定标准等信息
申请提交:填写申请理由、联系方式等信息,提交奖学金申请
申请状态跟踪:实时查看申请进度和审核状态(申请中/已通过/已拒绝)
申请记录管理:查看历史申请记录,支持按状态筛选
申请详情查看:查看申请的具体信息和审核意见
个人信息管理
课程成绩查看:查看个人所有课程成绩,包括学位课程和非学位课程
成绩统计分析:显示总课程数、学位课程数、平均成绩、学位课平均分等统计信息
奖学金规则了解:查看详细的奖学金评定规则和评分标准
3.1.3 导师端功能模块
申请审核管理
申请列表查看:查看所有学生的奖学金申请,支持按状态筛选
申请详情审核:查看学生申请的具体信息,包括申请理由、联系方式等
审核操作:对申请进行通过或拒绝操作,更新申请状态
审核意见管理:为审核结果添加相应的审核意见
成绩管理功能
学生成绩录入:为指定学生录入课程成绩信息
成绩批量导入:支持Excel文件批量导入学生成绩
成绩查询统计:按学生、课程、年级等维度查询和统计成绩
成绩修改更新:对已录入的成绩进行修改和更新操作
数据统计分析
申请统计:统计待审核、已通过、已拒绝的申请数量
奖学金排名:按奖学金类型显示申请学生的综合排名
最近申请查看:显示最近的申请记录,便于及时处理
3.1.4 数据管理功能
奖学金信息管理
奖学金类型管理:管理不同类型的奖学金(国家奖学金、学业奖学金、专项奖学金等)
奖学金标准设置:设置奖学金的金额、级别、评定年度等信息
奖学金规则配置:配置不同年级的评分标准和权重
学生信息管理
学生基本信息:管理学生的学号、姓名、年级、专业、导师等基本信息
学生成绩数据:管理学生的课程成绩、学位课程标识等学业数据
科研成果记录:记录学生的论文发表、专利申请、科研项目等科研成果
社会服务记录:记录学生的学生干部经历、志愿服务、活动参与等社会服务
综合评分计算
多维度评分:根据学业成绩、思政表现、科研能力、社会服务四个维度进行评分
年级差异化评分:针对研一、研二、研三不同年级采用不同的评分标准
自动分数计算:系统自动计算学生的综合得分,支持分数上限控制
3.1.5 系统管理功能
数据展示与查询
分页显示:支持大量数据的分页展示,提高系统性能
条件筛选:支持按学生、年级、状态、时间等条件进行数据筛选
数据排序:支持按不同字段进行升序或降序排列
数据导出:支持将查询结果导出为Excel等格式
3.2 系统特色功能
根据学生年级自动应用不同的评分标准
研一:研究生院统一评定
研二:学业成绩(20分) + 思政表现(30分) + 科研能力(30分) + 社会服务(20分)
研三:思政表现(30分) + 科研能力(50分) + 社会服务(20分)
申请流程管理
完整的申请-审核-评定流程
防止重复申请机制
申请状态实时更新
审核意见反馈机制
数据完整性保障
外键约束确保数据一致性
事务管理保证数据操作的原子性
4.总体设计
前端展示层 (Frontend Layer)
│── 学生端界面 (Student Views)
│ ├── 登录页面 (Login.vue)
│ ├── 学生仪表板 (Dashboard.vue)
│ ├── 奖学金申请 (ApplyScholarship.vue)
│ ├── 我的申请 (MyApplications.vue)
│ ├── 课程成绩 (CourseScores.vue)
│ └── 奖学金规则 (ScholarshipRules.vue)
│ └── 导师端界面 (Professor Views)
└── 导师仪表板 (Dashboard.vue)
├── 申请审核 (ReviewApplications.vue)
├── 成绩管理 (CourseScoreManagement.vue)
└── 奖学金排名 (Scoreboard.vue)
业务逻辑层 (Business Logic Layer)
Spring Boot 2.x + MyBatis + Spring Security
├── 控制器层 (Controller Layer)
│ ├── AuthController - 用户认证
│ ├── ScholarshipController - 奖学金管理
│ ├── ScholarshipApplicationController - 申请管理
│ ├── CourseScoreController - 成绩管理
│ ├── StudentController - 学生管理
│ └── TutorController - 导师管理
├── 服务层 (Service Layer)
│ ├── ScholarshipService - 奖学金业务逻辑
│ ├── ScholarshipApplicationService - 申请业务逻辑
│ ├── CourseScoreService - 成绩业务逻辑
│ ├── ScoreCalculationService - 评分计算逻辑
│ ├── StudentService - 学生业务逻辑
│ └── TutorService - 导师业务逻辑
└── 数据访问层 (Data Access Layer)
├── Mapper接口 (MyBatis Mappers)
└── XML映射文件 (MyBatis XML Files)

4.1架构设计
┌────────────────┐
│ 前端层 (Vue.js) │
│ 用户界面和交互逻辑 │
└────────┬───────┘
│ HTTP请求/响应
┌────────▼───────┐
│ 后端层 (Spring Boot) │
│ ┌─────┬──────┐ │
│ │ 控制器层 │ 服务层 │ │
│ │ Controller │ Service │ │
│ └─────┴──────┘ │
│ ┌────────────┐ │
│ │ 数据访问层 │ │
│ │ Mapper │ │
│ └────────────┘ │
└───────┬────────┘
│ SQL查询
┌───────▼────────┐
│ 数据层 (MySQL) │
│ 数据库存储和管理 │
└────────────────┘
4.2 功能模块设计
需要具体描述每个功能模块。
举例:
用户管理模块:负责用户的注册、登录、权限控制等。设计登录界面,用户信息展示与编辑功能。
数据展示模块:通过表格展示不同的数据,支持排序、筛选和分页等操作。
4.3数据库设计
此次系统使用的数据库为 MySQL数据库,对数据进行持久层的存储与处理,确保了数据的安全存储和持久性。经过综合设计与考虑,并针对实际需求的需要,设置了多个表。其中核心模块:
(1)导师信息表:包含导师ID(tutor_id)、姓名(name)、密码(password)导师组ID(group_id)。
(2)学生基本信息表:学号(student_id)、姓名(name)、年级(grade)、导师ID(tutor_id)。
(3)奖学金信息表:奖学金ID(scholarship_id)、名称(name)、级别(level)、最高金额(max_amount)、评定年度(year)。
(4)学生课程成绩表:成绩ID(score_id)、学号(student_id)、课程ID(course_id)、课程名称(course_name)、成绩(score)、是否学位课(0否1是)(is_degree_course)、
4.2.1导师信息表
CREATE TABLE tutor (
tutor_id VARCHAR(20) PRIMARY KEY,
password VARCHAR(255) NOT NULL DEFAULT ‘123’,
name VARCHAR(50) NOT NULL,
title VARCHAR(50) DEFAULT ‘教授’,
department VARCHAR(100) DEFAULT ‘计算机学院’,
group_id VARCHAR(20)
);
4.2.2学生基本信息表
CREATE TABLE student (
student_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
grade VARCHAR(20) NOT NULL,
major VARCHAR(100),
tutor_id VARCHAR(20)
);
4.2.3奖学金表 (scholarship)
CREATE TABLE scholarship (
scholarship_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(100) NOT NULL,
level VARCHAR(50),
max_amount DECIMAL(10,2),
year INT
);
4.2.4奖学金申请表 (scholarship_application)
CREATE TABLE scholarship_application (
application_id VARCHAR(50) PRIMARY KEY,
student_id VARCHAR(20),
scholarship_id VARCHAR(20),
total_score DECIMAL(5,2),
ideology_score DECIMAL(5,2) DEFAULT 0,
academic_score DECIMAL(5,2) DEFAULT 0,
research_score DECIMAL(5,2) DEFAULT 0,
service_score DECIMAL(5,2) DEFAULT 0,
status VARCHAR(20) DEFAULT ‘pending’,
apply_date DATE,
reason TEXT,
contact VARCHAR(100),
remark TEXT,
FOREIGN KEY (student_id) REFERENCES student(student_id),
FOREIGN KEY (scholarship_id) REFERENCES scholarship(scholarship_id)
);

4.2.5课程成绩表 (course_score)
CREATE TABLE course_score (
score_id VARCHAR(50) PRIMARY KEY,
student_id VARCHAR(20) NOT NULL,
course_id VARCHAR(20) NOT NULL,
course_name VARCHAR(100) NOT NULL,
score DECIMAL(5,2) NOT NULL,
is_degree_course BOOLEAN DEFAULT FALSE,
FOREIGN KEY (student_id) REFERENCES student(student_id)
);

数据库关系图
学生表 ←→ 导师表 (多对一关系
学生表 ←→ 奖学金申请表(一对多关系)
奖学金表 ←→ 奖学金申请表 (一对多关系)
学生表 ←→ 课程成绩表 (一对多关系)

  1. 系统实现
    对系统实际代码的实现描述,通常包括各个功能模块的具体代码实现。每个子模块可以通过代码段和相关说明来介绍。
    5.1 用户认证模块实现
    5.1.1 用户认证模块实现
    5.1.11 登录验证逻辑
    系统通过学号前缀区分用户类型,实现统一的登录接口
    @RestController
    @RequestMapping(“/auth”)
    public class AuthController {
    @PostMapping(“/login”)
    public ResponseEntity<?> login(@RequestBody LoginRequest request) {
    String userId = request.getUserId();
    String password = request.getPassword();
    // 根据学号前缀判断用户类型
    if (userId.startsWith(“S”)) {
    // 学生登录验证
    Student student = studentService.login(userId, password);
    if (student != null) {
    return ResponseEntity.ok(Map.of(
    “success”, true,
    “role”, “student”,
    “user”, student
    ));
    }
    } else if (userId.startsWith(“T”)) {
    // 导师登录验证
    Tutor tutor = tutorService.login(userId, password);
    if (tutor != null) {
    return ResponseEntity.ok(Map.of(
    “success”, true,
    “role”, “tutor”,
    “user”, tutor
    ));
    }
    }
    return ResponseEntity.badRequest().body(Map.of(
    “success”, false,
    “message”, “用户名或密码错误”
    )); }}
    实现要点:
  • 使用@PostMapping处理POST请求

  • 通过startsWith()方法判断学号前缀

  • 返回统一的JSON格式响应

  • 支持学生和导师两种角色登录
    5.1.1.2 登录拦截器
    实现登录状态验证,保护需要认证的接口:
    @Component
    public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
    Object handler) throws Exception {
    // 检查登录状态
    String token = request.getHeader(“Authorization”);
    if (token == null || !isValidToken(token)) {
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    return false;
    }
    return true;
    }
    }
    5.2.2奖学金申请模块实现
    5.2.2.1 申请创建与更新
    实现防重复申请机制,支持申请创建和更新:@RestController
    @RequestMapping(“/api/scholarship-applications”)
    public class ScholarshipApplicationController {

    @PostMapping(“/create-or-update”)
    public ResponseEntity<?> createOrUpdateApplication(@RequestBody ScholarshipApplication application) {
    try {
    // 检查是否已存在申请
    ScholarshipApplication existing = applicationService
    .getApplicationByStudentAndScholarship(application.getStudentId(), application.getScholarshipId());

          if (existing != null) {
              // 更新现有申请
              application.setApplicationId(existing.getApplicationId());
              application.setStatus("申请中");
              ScholarshipApplication updated = applicationService
                  .updateApplication(application.getApplicationId(), application);
              return ResponseEntity.ok(updated);
          } else {
              // 创建新申请
              application.setApplicationId(UUID.randomUUID().toString());
              application.setStatus("申请中");
              application.setApplyDate(LocalDate.now());
              ScholarshipApplication created = applicationService.addApplication(application);
              return new ResponseEntity<>(created, HttpStatus.CREATED);
          }
      } catch (Exception e) {
          return ResponseEntity.badRequest().body(Map.of(
              "success", false,
              "message", "申请提交失败:" + e.getMessage()
          ));
      }
    

    }
    }实现要点:

  • 使用UUID生成唯一申请ID

  • 通过学生ID和奖学金ID组合防止重复申请

  • 自动设置申请状态和申请日期

  • 异常处理确保系统稳定性
    5.2.2.2 申请审核功能
    实现导师审核申请的功能:
    @PutMapping(“/{applicationId}/approve”)
    public ResponseEntity<?> approveApplication(@PathVariable String applicationId) {
    try {
    ScholarshipApplication application = applicationService.getApplicationById(applicationId);
    if (application == null) {
    return ResponseEntity.notFound().build();
    }

      // 计算综合评分
      BigDecimal totalScore = scoreCalculationService
          .calculateTotalScore(application, GradeType.valueOf(application.getStudent().getGrade()));
      application.setTotalScore(totalScore);
      application.setStatus("已通过");
      
      ScholarshipApplication updated = applicationService
          .updateApplication(applicationId, application);
      return ResponseEntity.ok(updated);
    

    } catch (Exception e) {
    return ResponseEntity.badRequest().body(Map.of(
    “success”, false,
    “message”, “审核失败:” + e.getMessage()
    ));
    }
    }
    5.2.3成绩管理模块实现
    5.2.3.1成绩统计功能
    实现学生成绩统计和平均分计算:
    @Service
    public class CourseScoreServiceImpl implements CourseScoreService {

    @Override
    public BigDecimal calculateAverageScoreByStudentId(String studentId) {
    List scores = getScoresByStudentId(studentId);
    if (scores.isEmpty()) {
    return BigDecimal.ZERO;
    }

      BigDecimal totalScore = scores.stream()
          .map(CourseScore::getScore)
          .reduce(BigDecimal.ZERO, BigDecimal::add);
      
      return totalScore.divide(new BigDecimal(scores.size()), 2, RoundingMode.HALF_UP);
    

    }
    }
    5.2.4评分计算模块实现

5.2.4.1 综合评分算法
实现基于年级的差异化评分标准:
@Service
public class ScoreCalculationServiceImpl implements ScoreCalculationService {

@Override
public BigDecimal calculateTotalScore(ScholarshipApplication application, GradeType gradeType) {
    BigDecimal totalScore = BigDecimal.ZERO;
    
    switch (gradeType) {
        case GRADUATE_2:
            // 研二评分标准:学业成绩(20%) + 思政表现(30%) + 科研能力(30%) + 社会服务(20%)
            BigDecimal academicScore = calculateAcademicScore(application.getStudentId()) 
                .multiply(new BigDecimal("0.2"));
            BigDecimal ideologyScore = calculateIdeologyScore(application.getStudentId()) 
                .multiply(new BigDecimal("0.3"));
            BigDecimal researchScore = calculateResearchScore(application.getStudentId()) 
                .multiply(new BigDecimal("0.3"));
            BigDecimal serviceScore = calculateServiceScore(application.getStudentId()) 
                .multiply(new BigDecimal("0.2"));
            
            totalScore = academicScore.add(ideologyScore).add(researchScore).add(serviceScore);
            break;
            
        case GRADUATE_3:
            // 研三评分标准:思政表现(30%) + 科研能力(50%) + 社会服务(20%)
            ideologyScore = calculateIdeologyScore(application.getStudentId()) 
                .multiply(new BigDecimal("0.3"));
            researchScore = calculateResearchScore(application.getStudentId()) 
                .multiply(new BigDecimal("0.5"));
            serviceScore = calculateServiceScore(application.getStudentId()) 
                .multiply(new BigDecimal("0.2"));
            
            totalScore = ideologyScore.add(researchScore).add(serviceScore);
            break;
    }
    
    return totalScore.setScale(2, RoundingMode.HALF_UP);
}

}

5.2.4.2 成绩转换算法

实现百分制成绩到评分制的转换:
private BigDecimal calculateAcademicScore(String studentId) {
BigDecimal averageScore = courseScoreService.calculateAverageScoreByStudentId(studentId);
if (averageScore == null) return BigDecimal.ZERO;

// 成绩转换标准
if (averageScore.compareTo(new BigDecimal("90")) >= 0) {
    return new BigDecimal("20");  // 90分以上20分
} else if (averageScore.compareTo(new BigDecimal("80")) >= 0) {
    return new BigDecimal("18");  // 80-89分18分
} else if (averageScore.compareTo(new BigDecimal("70")) >= 0) {
    return new BigDecimal("16");  // 70-79分16分
} else if (averageScore.compareTo(new BigDecimal("60")) >= 0) {
    return new BigDecimal("14");  // 60-69分14分
} else {
    return new BigDecimal("10");  // 60分以下10分
}

}

5.2.5 数据查询模块实现

5.2.5.1 奖学金排名查询
实现基于总分的奖学金申请排名:
xml

SELECT sa.*, s.name as student_name, sch.name as scholarship_name FROM scholarship_application sa LEFT JOIN student s ON sa.student_id = s.student_id LEFT JOIN scholarship sch ON sa.scholarship_id = sch.scholarship_id WHERE sa.scholarship_id = #{scholarshipId} AND sa.status = '已通过' ORDER BY sa.total_score DESC

5.2.5.2 学生申请查询
实现学生个人申请记录查询:
@GetMapping(“/student/{studentId}”)
public ResponseEntity<?> getApplicationsByStudent(@PathVariable String studentId) {
List applications = applicationService
.getApplicationsByStudentId(studentId);
return ResponseEntity.ok(applications);
}

5.2.6 前端交互模块实现
5.2.6.1 表单验证
实现前端表单数据验证:
// 联系方式格式验证
const validateContact = (contact) => {
const phoneRegex = /^1[3-9]\d{9}KaTeX parse error: Double superscript at position 30: …mailRegex = /^[^̲\s@]+@[^\s@]+\.…/;

if (phoneRegex.test(contact)) {
    return { valid: true, type: 'phone' };
} else if (emailRegex.test(contact)) {
    return { valid: true, type: 'email' };
} else {
    return { valid: false, message: '请输入正确的手机号或邮箱' };
}

};

5.2.6.2 API接口调用
实现前后端数据交互:

// 奖学金申请提交
const submitApplication = async (applicationData) => {
try {
const response = await axios.post(‘/api/scholarship-applications/create-or-update’, applicationData);
if (response.data.success) {
ElMessage.success(‘申请提交成功’);
return true;
} else {
ElMessage.error(response.data.message);
return false;
}
} catch (error) {
ElMessage.error(‘网络错误,请稍后重试’);
return false;
}
};
5.2.7 异常处理模块实现

5.2.7.1 统一异常处理
实现全局异常处理机制:
@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleException(Exception e) {
    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
        .body(Map.of(
            "success", false,
            "message", "系统内部错误:" + e.getMessage()
        ));
}

@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<?> handleIllegalArgumentException(IllegalArgumentException e) {
    return ResponseEntity.badRequest()
        .body(Map.of(
            "success", false,
            "message", "参数错误:" + e.getMessage()
        ));
}

}
实现要点:

  • 使用@ControllerAdvice实现全局异常处理
  • 区分不同类型的异常,返回相应的HTTP状态码
  • 提供统一的错误响应格式
  • 便于前端统一处理错误信息
    5.3 核心代码示例

5.3.1 用户登录验证逻辑
关键代码片段:
@PostMapping(“/login”)
public ResponseEntity<?> login(@RequestBody LoginRequest request) {
String userId = request.getUserId();

// 根据学号前缀判断用户类型
if (userId.startsWith("S")) {
    // 学生登录逻辑
    Student student = studentService.login(userId, password);
    return ResponseEntity.ok(Map.of("success", true, "role", "student"));
} else if (userId.startsWith("T")) {
    // 导师登录逻辑
    Tutor tutor = tutorService.login(userId, password);
    return ResponseEntity.ok(Map.of("success", true, "role", "tutor"));
}

}
技术要点:

  • 通过学号前缀"S"和"T"区分学生和导师角色

  • 使用Spring的@PostMapping注解处理POST请求

  • 返回统一的JSON格式响应
    5.3.2 奖学金申请防重复机制
    关键代码片段:
    @PostMapping(“/create-or-update”)
    public ResponseEntity<?> createOrUpdateApplication(@RequestBody ScholarshipApplication application) {
    // 检查是否已存在申请
    ScholarshipApplication existing = applicationService
    .getApplicationByStudentAndScholarship(application.getStudentId(), application.getScholarshipId());

    if (existing != null) {
    // 更新现有申请
    application.setApplicationId(existing.getApplicationId());
    application.setStatus(“申请中”);
    return ResponseEntity.ok(applicationService.updateApplication(application.getApplicationId(), application));
    } else {
    // 创建新申请
    application.setApplicationId(UUID.randomUUID().toString());
    application.setStatus(“申请中”);
    application.setApplyDate(LocalDate.now());
    return new ResponseEntity<>(applicationService.addApplication(application), HttpStatus.CREATED);
    }
    }
    技术要点:

  • 通过学生ID和奖学金ID组合查询防止重复申请

  • 使用UUID生成唯一申请ID

  • 自动设置申请状态和申请日期

  • 区分创建和更新操作

5.4项目展示

登录界面:

学生用户仪表板:

奖学金申请过程:

提交申请完成:

我的奖学金申请记录:

学生课程成绩:

导师端登录后仪表板:

导师审核申请

导师查看奖学金排名(下拉栏可选年级/奖学金类型)

导师成绩管理界面

  1. 总结与展望
    这个课设对我而言难度很大的,基本上没有接触过前后端任何一项,所以做起来无比吃力,第一周基本上都是在看网课学习。但是这次课设做完后也都掌握了一些基本原理。之前的课设做的让我们心安了,以至于没想到这次会这么难是一个完全新的挑战,刚开始非常迷茫,我的选题项目让我无从下手,在这这几周的编写过程中碰到了无数问题,前后端接口对不上,数据库丢失而我也没有备份只能重新开始,但只能硬着头皮坚持下来,每当后端接口测试成功,前后端成功交互时的成就感是难以形容的。这次课设让,我收益满满,学会了使用各种工具定位和解决问题的能力。这次数据库课程设计让我真正体会到了"做中学"的价值,不仅巩固了已有知识,还促使我学习了很多新技术。最大的收获不是完成了一个系统,而是掌握了持续学习和解决问题的能力。
    最后感谢老师的指导和同学对我的帮助。

参 考 文 献
[1] 王珊, 萨师煊. 数据库系统概论(第5版)[M]. 北京: 高等教育出版社, 2014.
[2] 尤雨溪. Vue.js设计与实现[M]. 北京: 人民邮电出版社, 2022.
[3] 李刚. 轻量级Java EE企业应用实战[M]. 北京: 电子工业出版社, 2020.
[4] Freeman A, Robson E. Head First Vue.js[M]. O’Reilly Media, 2020.
[5] 阿里巴巴Java开发手册[M]. 北京: 电子工业出版社, 2020.
[6] Johnson R. Professional Java Development with the Spring Framework[M]. Wiley Publishing, 2005.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程ID

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值