1. 项目背景与核心功能
陕西理工大学奖学金评定管理系统是一个基于SpringBoot+Vue技术栈的Web应用,专为高校奖学金评定流程数字化管理而设计。这个毕设项目完整实现了从学生申请、院系审核到学校审批的全流程线上化操作,解决了传统纸质申报中效率低下、数据易丢失、统计困难等痛点。
系统采用前后端分离架构,后端基于SpringBoot 2.7.x构建RESTful API,前端使用Vue 3组合式API开发响应式界面,数据库采用MySQL 8.0。项目源码包含完整的权限控制模块,支持学生、班主任、院系管理员和学校管理员四种角色,每种角色拥有不同的操作权限和数据视图。
特别提示:本系统在设计时特别考虑了高校实际评审场景,如多级审批流程、量化评分自动计算、材料真实性校验等关键功能点,这些都是在真实校园环境中验证过的需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构详解
2.1 后端技术栈实现
SpringBoot后端采用经典的三层架构设计:
- 持久层:MyBatis-Plus 3.5.x + 动态数据源(支持多学期数据隔离)
- 业务层:自定义评审规则引擎 + 审计日志切面
- 控制层:统一异常处理 + JWT认证过滤器
核心配置示例(application.yml节选):
yaml复制scholarship:
rule-engine:
score-calculator: weighted # 支持weighted(加权)/additive(累加)两种计分模式
auto-approve-threshold: 85 # 自动审批分数线
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
global-config:
db-config:
logic-delete-field: deleted # 逻辑删除字段
2.2 前端技术方案
Vue前端采用的技术方案包括:
- UI框架:Element Plus + Vue Router 4
- 状态管理:Pinia替代Vuex
- 特色功能:
- 动态表单生成器(支持评审表自定义)
- 文件分片上传(解决大材料上传问题)
- WebSocket实时通知审批状态
典型页面组件结构:
code复制src/
├── components/
│ ├── application/
│ │ ├── ScoreInput.vue # 评分输入组件
│ │ └── EvidenceUpload.vue # 佐证材料上传
├── stores/
│ └── useApplicationStore.js # Pinia存储
3. 数据库设计与关键SQL
3.1 核心表结构
数据库包含12张主要表,其中核心表关系如下:
| 表名 | 字段示例 | 说明 |
|---|---|---|
| t_student | (id,学号,班级,专业,GPA) | 学生基础信息 |
| t_application | (id,学生ID,学期,总分,状态) | 申请主表 |
| t_score_item | (id,申请ID,评分项,得分,审核人) | 评分明细 |
| t_approval_flow | (id,申请ID,审批人,审批意见,审批时间) | 审批流程记录 |
3.2 关键SQL操作
- 奖学金得分统计视图:
sql复制CREATE VIEW v_scholarship_rank AS
SELECT
s.学号, s.姓名, a.总分,
RANK() OVER(PARTITION BY s.专业 ORDER BY a.总分 DESC) AS 专业排名
FROM t_student s
JOIN t_application a ON s.id = a.学生ID
WHERE a.状态 = '已通过';
- 多条件查询申请(MyBatis动态SQL示例):
xml复制<select id="selectApplications" resultMap="ApplicationResult">
SELECT * FROM t_application
<where>
<if test="major != null">AND 专业 = #{major}</if>
<if test="semester != null">AND 学期 = #{semester}</if>
<if test="status != null">AND 状态 = #{status}</if>
</where>
ORDER BY 总分 DESC
LIMIT #{offset}, #{pageSize}
</select>
4. 接口文档规范
系统采用Swagger + OpenAPI 3.0生成交互式文档,关键接口包括:
4.1 学生端接口
POST /api/application提交申请GET /api/application/{id}/status查询审批进度
4.2 教师端接口
PUT /api/approval/score录入评分POST /api/approval/batch-approve批量审批
4.3 接口安全设计
- 采用JWT + RBAC双重验证
- 敏感操作(如分数修改)需二次密码确认
- 所有POST/PUT请求强制CSRF Token校验
接口响应示例:
json复制{
"code": 200,
"data": {
"applicationId": 123,
"nextApprover": "李老师"
},
"message": "申请提交成功"
}
5. 部署与二次开发指南
5.1 环境准备
-
开发环境:
- JDK 17 + Node.js 16.x
- IDEA/VSCode + Lombok插件
- MySQL 8.0+(需开启INNODB引擎)
-
生产部署:
bash复制# 后端打包
mvn clean package -DskipTests
# 前端构建
npm run build
5.2 常见问题解决方案
- 跨域问题:确保后端配置了正确的CORS规则
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
- PDF导出乱码:需在服务器安装中文字体
dockerfile复制RUN apt-get update && apt-get install -y fonts-wqy-zenhei
5.3 扩展建议
- 可集成钉钉/微信消息通知
- 添加区块链存证功能确保数据不可篡改
- 支持可视化数据分析看板
6. 项目实战经验分享
在实际开发中,有几个关键点需要特别注意:
- 评审规则引擎设计:
java复制// 策略模式实现不同评分规则
public interface ScoreStrategy {
BigDecimal calculate(List<ScoreItem> items);
}
@Component("weighted")
public class WeightedStrategy implements ScoreStrategy {
@Override
public BigDecimal calculate(List<ScoreItem> items) {
return items.stream()
.map(i -> i.getScore().multiply(i.getWeight()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
- 大文件上传优化:
- 前端采用分片上传(每片2MB)
- 后端使用MD5校验文件完整性
- 文件存储采用MinIO替代本地存储
- 性能监控技巧:
java复制@Aspect
@Component
@Slf4j
public class PerformanceMonitor {
@Around("execution(* com.snut.scholarship.service..*(..))")
public Object logTime(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.proceed();
log.info("{} executed in {}ms",
pjp.getSignature(),
System.currentTimeMillis() - start);
return result;
}
}
这个项目不仅适合作为计算机专业毕业设计,经过适当改造后完全可以投入实际使用。我在开发过程中最大的体会是:高校业务系统的核心不在于技术复杂度,而在于对实际业务流程的精准把握。建议开发前至少访谈3类用户(学生、班主任、教务员),他们的痛点往往能催生最有价值的功能设计。
