高校教师教研信息管理一直是教育信息化建设中的重要环节。传统的手工填报方式存在诸多痛点:纸质表格容易丢失破损、数据更新不及时、统计汇总耗时费力、多部门协同困难。以某高校文学院为例,每年期末需要收集全院80多位教师的教研成果,仅数据整理就需要3名教务人员全职工作两周。
我们设计的这套系统主要解决以下核心问题:
后端选择SpringBoot的三大理由:
前端选择Vue.js的关键考量:
持久层方案对比:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| JPA | 无需写SQL | 复杂查询性能差 | 简单CRUD系统 |
| MyBatis | SQL灵活可控 | 需手动编写映射文件 | 需要复杂查询的系统 |
| JDBC | 性能最优 | 开发效率最低 | 遗留系统改造 |
最终选择MyBatis-plus方案,在保留SQL灵活性的同时,通过通用Mapper减少30%的重复代码。
code复制教师浏览器 → Vue前端 → SpringBoot REST API → MyBatis → MySQL
↑ ↑ ↑
Element UI Axios Spring Security
关键设计要点:
数据库设计优化实践:
sql复制CREATE TABLE `teacher` (
`teacher_id` VARCHAR(20) PRIMARY KEY COMMENT '工号作为自然主键',
`name` VARCHAR(50) NOT NULL COMMENT '中文姓名存储',
`gender` CHAR(1) CHECK (gender IN ('M','F')) COMMENT '枚举约束',
`department_id` INT COMMENT '关联院系表',
`title` ENUM('助教','讲师','副教授','教授') COMMENT '固定职称选项',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
接口开发注意事项:
java复制@PostMapping
public Result addTeacher(@Valid @RequestBody TeacherDTO dto) {
// 业务逻辑
}
典型业务逻辑实现:
java复制public void submitProject(ProjectVO vo) {
// 1. 校验教师状态是否可用
Teacher teacher = teacherMapper.selectById(vo.getTeacherId());
if(teacher.getStatus() != 1) {
throw new BusinessException("该教师账号已被禁用");
}
// 2. 转换VO为Entity
Project project = new Project();
BeanUtils.copyProperties(vo, project);
project.setStatus("PENDING"); // 初始状态
// 3. 级联保存项目成员
projectMapper.insert(project);
vo.getMembers().forEach(member -> {
projectMemberMapper.insert(member);
});
}
性能优化点:
Excel导出技术方案对比:
| 方案 | 导出速度 | 内存占用 | 功能丰富度 |
|---|---|---|---|
| POI | 慢 | 高 | 高 |
| EasyExcel | 快 | 低 | 中 |
| JasperReport | 中 | 中 | 高 |
最终选用EasyExcel实现百万级数据导出:
java复制public void exportAchievements(HttpServletResponse response) {
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=achievements.xlsx");
// 1. 查询数据(分页查询避免OOM)
List<Achievement> data = achievementService.listAll();
// 2. 设置导出配置
ExcelWriter writer = EasyExcel.write(response.getOutputStream())
.head(Achievement.class)
.build();
// 3. 写入数据
writer.write(data, EasyExcel.writerSheet("成果列表")).finish();
}
code复制权限表(permission) ← 角色权限关联表(role_permission) → 角色表(role) ← 用户角色关联表(user_role) → 用户表(user)
Spring Security配置要点:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/teacher/**").hasAnyRole("TEACHER","ADMIN")
.antMatchers("/api/public/**").permitAll()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
javascript复制{
path: '/admin',
component: AdminPanel,
meta: { roles: ['ADMIN'] }
}
javascript复制Vue.directive('permission', {
inserted(el, binding) {
if (!checkPermission(binding.value)) {
el.parentNode.removeChild(el);
}
}
})
推荐使用Docker Compose编排:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql-data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
跨域问题解决方案:
javascript复制devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
nginx复制location /api {
proxy_pass http://backend:8080;
add_header 'Access-Control-Allow-Origin' '*';
}
性能调优经验:
xml复制<cache eviction="LRU" flushInterval="60000" size="512"/>
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
我在实际部署中发现,高校IT环境存在一些特殊限制:通常要求使用IE11浏览器、禁止使用云服务等。因此建议提前做好兼容性测试,并准备离线部署方案。对于需要与现有教务系统集成的场景,建议采用WebService作为中间接口,而不是直接库表关联。